Apache DolphinScheduler “僵尸任务”怎么处理?新旧版本安全清理方案

在DolphinScheduler运行过程中,有时会出现任务界面显示\\x26quot;运行中\\x26quot;状态,但实际进程已经死亡的情况。


点亮⭐️  

https://github.com/apache/DolphinScheduler



点击蓝字 关注我们



问题描述



在DolphinScheduler运行过程中,有时会出现任务界面显示"运行中"状态,但实际进程已经死亡的情况。这种状态不一致会导致工作流无法正常推进,需要手动干预。本文将针对不同版本提供安全清理方案。

问题原因分析


任务卡在"运行中"状态通常由以下原因造成:

  1. 数据库延迟:当数据库出现延迟时,任务状态更新可能失败,导致界面显示与实际状态不一致
  2. Worker节点异常:Worker服务意外停止,但Master未及时感知
  3. 网络抖动:ZooKeeper心跳超时导致节点remove事件触发,但任务进程仍在运行
  4. 任务实例为空:日志显示任务实例为null,但状态仍为运行中

旧版本处理方式(1.2.1以下)


对于1.2.1之前的版本,需要手动执行以下步骤:

步骤1:清理ZooKeeper任务队列

# 清空ZooKeeper中的任务队列路径delete /dolphinscheduler/task_queue

这一步确保卡住的任务不会继续阻塞队列。

步骤2:修改任务状态为失败

通过数据库直接更新任务实例状态:

-- 将卡住的任务状态改为失败(状态码6)UPDATE t_ds_task_instance SET state = 6 WHERE state = 1 AND task_instance_id = <卡住的任务ID>;

状态码说明:

  • 1: 运行中 (RUNNING_EXECUTION)
  • 6: 失败 (FAILURE)

步骤3:从失败节点恢复工作流

在DolphinScheduler UI中:

  1. 找到对应的工作流实例
  2. 点击"从失败恢复"按钮
  3. 系统将从失败节点重新执行

新版本处理方式(1.2.1+)



从1.2.1版本开始,系统引入了自动容错机制,大部分情况无需手动干预。

自动容错机制

新版本的容错设计基于ZooKeeper的Watcher机制:

僵尸任务

Worker容错流程

当Worker节点发生remove事件时:

  1. Master只容错任务实例(不处理流程实例)
  2. 比较实例开始时间与服务节点启动时间
  3. 如果实例在服务启动之后开始,则跳过容错
  4. 否则,将任务状态设置为"需要容错"
  5. Master Scheduler线程接管并重新提交任务

任务状态机处理

新版本使用状态机管理任务生命周期,包括暂停和杀死操作:

// 任务杀死事件处理public void onKilledEvent(...) {    releaseTaskInstanceResourcesIfNeeded(taskExecutionRunnable);    persistentTaskInstanceKilledEventToDB(taskExecutionRunnable, taskInstanceKillEvent);    taskExecutionRunnable.getWorkflowExecutionGraph()        .markTaskExecutionRunnableChainKill(taskExecutionRunnable);    publishWorkflowInstanceTopologyLogicalTransitionEvent(taskExecutionRunnable);}

版本对比总结



特性
1.2.1以下版本
1.2.1+版本
容错机制
手动处理
自动容错
ZooKeeper队列清理
需要手动清理
自动处理
任务状态更新
需要数据库操作
状态机自动管理
Worker故障恢复
需要手动干预
自动重新提交
网络抖动处理
需要停止服务
自动检测并容错


安全清理最佳实践


1. 诊断确认

在执行清理前,先确认任务确实已死:

# 检查Worker进程jps | grep WorkerServer# 检查任务进程ps -ef | grep <任务相关关键词># 查看任务日志tail -f /path/to/task.log

2. 优先使用UI操作

对于新版本,优先使用UI提供的操作:

  • 点击"停止"按钮终止任务
  • 使用"从失败恢复"功能重新执行

3. 数据库操作注意事项

如果必须直接操作数据库:

  • 先备份数据库
  • 确认任务ID准确无误
  • 只修改状态字段,不删除记录
  • 操作后验证工作流状态

4. ZooKeeper操作注意事项

清理ZooKeeper节点时:

  • 确认路径正确:/dolphinscheduler/task_queue
  • 使用ZooKeeper客户端工具操作
  • 避免误删其他关键节点

5. 监控和预防

为减少此类问题发生:

  • 监控数据库延迟
  • 设置合理的ZooKeeper会话超时时间
  • 定期检查Master和Worker服务状态
  • 配置服务监控脚本自动重启异常服务

总结


对于DolphinScheduler中卡在"运行中"的任务,处理方式因版本而异:

  • 旧版本(1.2.1以下):需要手动清理ZooKeeper队列、更新数据库状态、从失败节点恢复
  • 新版本(1.2.1+):依赖自动容错机制,大部分情况无需手动干预

建议升级到最新版本以获得更好的容错能力,同时建立完善的监控体系,及时发现和处理异常情况。

Notes


本文基于DolphinScheduler官方FAQ和架构设计文档编写,相关代码实现可参考AbstractTaskStateAction.java中的状态处理逻辑。对于生产环境,建议在测试环境验证操作步骤后再执行。




END






用户案例


DolphinScheduler Agent开源上线Cisco Webex天翼云Zoom网易邮箱 每日互动 惠生工程作业帮 博世智驾蔚来汽车 长城汽车集度长安汽车思科网讯食行生鲜联通医疗联想新网银行兴业证券唯品富邦消费金融 自如有赞伊利当贝大数据珍岛集团传智教育BigoYY直播  拈花云科太美医疗深圳某智能制造企业



迁移实战


Azkaban   Ooize(当贝迁移案例)airflow (有赞迁移案例)Air2phin(迁移工具)Airflow



最新发版消息



Apache DolphinScheduler 3.4.2 正式发布!新增 Amazon EMR Serverless 插件,增强监控与补数据能力



加入社区


关注社区的方式有很多:

  • GitHub: https://github.com/apache/dolphinscheduler
  • 官网:https://dolphinscheduler.apache.org/en-us
  • 订阅开发者邮件:dev@dolphinscheduler@apache.org(向邮箱发送任意内容,收到邮件后回复同意订阅即可)
  • X.com:@DolphinSchedule
  • YouTube:https://www.youtube.com/@apachedolphinscheduler
  • Slack:https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-1cmrxsio1-nJHxRJa44jfkrNL_Nsy9Qg

同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。

非代码方式包括:

完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。

‍代码方式包括:

查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3A%22first+time+contributor%22

优先级问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3Apriority%3Ahigh

如何参与贡献链接https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97_menu/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E_menu

如果你❤️小海豚,就来为我点亮Star吧!

https://github.com/apache/dolphinscheduler



你的好友小海豚拍了拍你

并请你帮她点一下“分享”