大数据

dolphinscheduler任务修复

ds服务器时区问题,服务启动时使用了未来时间,于是启动了很多未来时间定时任务,修复日期后重启ds服务,发现未来时间任务卡住,运行类型:调度执行,也没有删除或者停止操作。

记录本次问题解决方案:

在 DolphinScheduler 源码中(尤其是 2.x ~ 3.x 版本),state = 14 通常对应:

WAITING_THREADWAITING(等待线程资源/调度)

但这在时间回拨(time rollback)场景下,往往意味着:

  • 调度器认为这些实例“已经安排在未来执行”
  • 但当前时间已回退,调度逻辑无法处理“时间倒流”
  • 内部状态机陷入不一致,既不运行,也不允许删除

解决方案:批量清理“未来时间”产生的异常实例

步骤 1:确认哪些实例是“未来时间”产生的

-- 假设你是在 12 月 12 日 9:00 修正的时间
-- 而错误时间是 15:00(同一天)
-- 那么 process_instance 表中的 start_time 或 create_time 在 15:00 附近的很可能是异常实例

SELECT id, name, state, start_time , create_time, host
FROM t_ds_process_instance
WHERE state = 14
  AND start_time > '2025-12-12 14:00:00'  -- 根据你的时间调整
  AND start_time  < '2025-12-12 16:00:00';

步骤 2:强制终止并清理这些实例

-- 先更新状态为“失败”(state = 6)或“停止”(state = 5)
UPDATE t_ds_process_instance
SET state = 6, end_time = NOW()
WHERE state = 14
  AND start_time BETWEEN '2025-12-12 14:00:00' AND '2025-12-12 16:00:00';

-- 清理关联的 task_instance(避免残留)
DELETE FROM t_ds_task_instance
WHERE process_instance_id IN (
    SELECT id FROM t_ds_process_instance
    WHERE start_time BETWEEN '2025-12-12 14:00:00' AND '2025-12-12 16:00:00'
      AND state = 6
);

-- 清理残留 command(如有)
DELETE FROM t_ds_command
WHERE process_instance_id IN (
    SELECT id FROM t_ds_process_instance
    WHERE start_time BETWEEN '2025-12-12 14:00:00' AND '2025-12-12 16:00:00'
);

步骤 3:重启 DolphinScheduler 服务

# 停止
bin/dolphinscheduler-daemon.sh stop master-server
bin/dolphinscheduler-daemon.sh stop worker-server

# 启动
bin/dolphinscheduler-daemon.sh start master-server
bin/dolphinscheduler-daemon.sh start worker-server

重启后,UI 中那些被标记为“失败”的实例通常就可以正常删除了。