希望你永远用不上:Apache DolphinScheduler 任务阻塞死锁排查与解决方案

一次 ClickHouse 宕机引发的“血案”。
178816974490677e66b23c7f6f455


点亮⭐️

https://github.com/apache/DolphinScheduler



点击蓝字 关注我们



一次 ClickHouse 宕机引发的“血案”:200+ 任务疯狂重试把 CK 打挂,串行等待策略造成死锁,任务动弹不得。本文记录完整的排查过程和终极解决方案。


一、事故背景


1.1 事故经过

时间线:

  • 2026-02-03:ClickHouse 挂了,DolphinScheduler 任务随之停止
  • 2026-02-04:发现问题,重启 Dolphin,瞬间产生 200+ 补数任务
  • 结果:任务洪峰直接把刚恢复的 ClickHouse 再次打挂

重启 CK 后,发现任务全部阻塞,界面一片红:

1788169745458fb5cd0029682082a

现象:

  • 最底部的任务:状态 = 失败,点击停止后变成「准备停止」,卡住不动
  • 后续所有任务:状态 = 串行等待
  • 整个工作流:死锁,彻底动不了

机器配置:4C 32G,资源不是问题,问题出在调度策略上。

1.2 原因分析

罪魁祸首:任务执行策略配置了「串行等待」

1788169749129808ec3514f272889

串行等待的坑:

  1. 当一个任务实例在运行时,后续实例会排队等待
  2. 如果正在运行的任务异常(失败 / 准备停止),它既不释放锁,也不真正停止
  3. 后续任务永远等不到「前任」完成 → 死锁形成

尝试通过「补数运行」重新执行任务,直接报错:

“已经有一个进行中的任务了”(大意如此,现场没保留)

重启 Dolphin?没用。
手动停止任务?卡在「准备停止」。
等它自己恢复?别做梦了。

二、解决方案:直接改库


既然 UI 层面无能为力,那就釜底抽薪——直接操作 MySQL 数据库。

2.1 定位关键表

打开 DolphinScheduler 的数据库,共 65 张表。

根据命名规律,t_ds_process_* 开头的表与任务执行相关:

17881697504354204840f3cd005a5

核心表:

1788169751676bab1b47cb06c5ca7

2.2 查看异常数据

查询 t_ds_process_instance 表,找到那些阻塞的任务实例:


SELECT id, name, state, start_time, end_timeFROM t_ds_process_instanceWHERE state NOT IN (7)  -- 7 = 执行成功ORDER BY id DESCLIMIT 50;
状态码对照(常用):
1788169753831c678ee474619bc37

果然,一堆 state = 14(串行等待)和 state = 4(准备停止)的记录:

17881697544777c4df02df0d0b553

2.3 清理阻塞数据

  • 方案一:直接删除(简单粗暴)


-- 删除阻塞的工作流实例(谨慎操作,建议先备份)DELETE FROM t_ds_process_instanceWHERE state IN (4, 14)  -- 准备停止、串行等待  AND process_definition_code = <你的工作流code>;-- 同时清理对应的任务实例DELETE FROM t_ds_task_instanceWHERE process_instance_id IN (    SELECT id FROM t_ds_process_instance    WHERE state IN (4, 14));
  • 方案二:修改状态(相对温和)


-- 将阻塞任务改为「失败」状态,释放锁UPDATE t_ds_process_instanceSET state = 6  -- 6 = 失败WHERE state IN (4, 14);
注意:操作前务必备份数据,生产环境别直接 DELETE,先 SELECT 确认。

2.4 重新补数

清理完数据后,回到 DolphinScheduler 界面:

工作流定义 → 点击运行 → 选择「补数」

1788169760867386e1f0ace26ca01

这次终于不报错了,任务顺利执行:

178816976251153a97279dea02082

三、预防措施


吃一堑长一智,总结几点避坑经验:

3.1 慎用「串行等待」策略

1788169768228fa045497c20165d0

建议:除非业务强依赖顺序,否则用「串行抛弃」代替「串行等待」,避免任务堆积导致死锁。

3.2 配置任务超时

给任务设置合理的超时时间,避免任务长时间卡住占用资源:

超时告警 + 超时失败

3.3 监控告警

  • 监控 Dolphin 任务积压数量
  • 监控下游服务(如 ClickHouse)的健康状态
  • 任务失败及时告警,别等第二天才发现

3.4 下游服务容灾

这次事故的根源是 ClickHouse 宕机。考虑:

  • CK 集群部署,避免单点故障
  • 任务侧增加重试机制和熔断逻辑
  • 限制并发,防止重启后任务洪峰

四、总结


问题本质:串行等待策略 + 任务异常状态 = 死锁

解决思路:UI 搞不定就直接改库,清理 t_ds_process_instance 表中的异常记录

核心教训

  1. 「串行等待」是把双刃剑,用不好容易死锁
  2. 调度系统的数据库是最后的救命稻草
  3. 监控告警要到位,问题发现得越早,损失越小

希望你永远用不上这篇文章的解决方案。但如果用上了,记得先备份再动手。

原文链接:https://blog.csdn.net/fengquan8866/article/details/157738868




END




1788169773706f496dea826c2f156



用户案例


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



迁移实战


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



最新发版消息



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



加入社区


关注社区的方式有很多:

  • 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


17881697906068e04f33ce91bb9ea


178816979120902f47b6464bafe7d

你的好友小海豚拍了拍你

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