在DolphinScheduler运行过程中,有时会出现任务界面显示"运行中"状态,但实际进程已经死亡的情况。这种状态不一致会导致工作流无法正常推进,需要手动干预。本文将针对不同版本提供安全清理方案。
任务卡在"运行中"状态通常由以下原因造成:
对于1.2.1之前的版本,需要手动执行以下步骤:
# 清空ZooKeeper中的任务队列路径 delete /dolphinscheduler/task_queue
这一步确保卡住的任务不会继续阻塞队列。
通过数据库直接更新任务实例状态:
-- 将卡住的任务状态改为失败(状态码6) UPDATE t_ds_task_instance SET state = 6 WHERE state = 1 AND task_instance_id = <卡住的任务ID>;
状态码说明:
在DolphinScheduler UI中:
从1.2.1版本开始,系统引入了自动容错机制,大部分情况无需手动干预。
新版本的容错设计基于ZooKeeper的Watcher机制:

当Worker节点发生remove事件时:
新版本使用状态机管理任务生命周期,包括暂停和杀死操作:
// 任务杀死事件处理
public void onKilledEvent(...) {
releaseTaskInstanceResourcesIfNeeded(taskExecutionRunnable);
persistentTaskInstanceKilledEventToDB(taskExecutionRunnable, taskInstanceKillEvent);
taskExecutionRunnable.getWorkflowExecutionGraph()
.markTaskExecutionRunnableChainKill(taskExecutionRunnable);
publishWorkflowInstanceTopologyLogicalTransitionEvent(taskExecutionRunnable);
}
| 特性 | 1.2.1以下版本 | 1.2.1+版本 |
|---|---|---|
| 容错机制 | 手动处理 | 自动容错 |
| ZooKeeper队列清理 | 需要手动清理 | 自动处理 |
| 任务状态更新 | 需要数据库操作 | 状态机自动管理 |
| Worker故障恢复 | 需要手动干预 | 自动重新提交 |
| 网络抖动处理 | 需要停止服务 | 自动检测并容错 |
在执行清理前,先确认任务确实已死:
# 检查Worker进程 jps | grep WorkerServer # 检查任务进程 ps -ef | grep <任务相关关键词> # 查看任务日志 tail -f /path/to/task.log
对于新版本,优先使用UI提供的操作:
如果必须直接操作数据库:
清理ZooKeeper节点时:
/dolphinscheduler/task_queue为减少此类问题发生:
对于DolphinScheduler中卡在"运行中"的任务,处理方式因版本而异:
建议升级到最新版本以获得更好的容错能力,同时建立完善的监控体系,及时发现和处理异常情况。
本文基于DolphinScheduler官方FAQ和架构设计文档编写,相关代码实现可参考
AbstractTaskStateAction.java中的状态处理逻辑。对于生产环境,建议在测试环境验证操作步骤后再执行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70014275/viewspace-3176091/ ,如需转载,请注明出处,否则将追究法律责任。