You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow长运行任务未报错却被多次重试问题排查求助

排查Airflow长任务自动重试(retries=0仍触发)的思路

1. 先区分「重试」与「重新调度」

Airflow里的**重试(Retry)是任务失败后触发,日志会显式出现Marking task as UP_FOR_RETRY;而重新调度(Reschedule)**是Scheduler判定任务进程异常或主动触发,日志会有UP_FOR_RESCHEDULE标记。从你给出的时间间隔(后续5分钟和dag_dir_list_interval=300完全匹配)来看,大概率是Scheduler重新触发了任务,而非配置的重试机制。

2. 检查Executor相关配置与进程状态

  • 若使用CeleryExecutor:
    • 确认celeryd_heartbeat参数(默认10秒),Worker连续3次心跳无响应会被判定死亡,任务会被重新分配。即便改了job_heartbeat_sec,Celery自身的心跳配置也可能影响
    • 排查任务进程是否在运行时能正常发送心跳:循环调用REST接口时,避免长时间阻塞且不释放GIL的操作,比如纯CPU密集循环、未设置超时的同步IO调用
  • 若使用SequentialExecutor:Scheduler与Worker是同一进程,长任务会导致Scheduler无法正常扫描DAG,进而误判任务状态

3. 验证僵尸任务判定逻辑

即便修改了scheduler_zombie_task_threshold=3600,仍需确认:

  • 执行节点上是否存在多个相同任务进程:用ps aux | grep <你的任务进程名>查看
  • 元数据库task_instance表的状态变化:执行SQL查询
    SELECT task_id, state, start_date, end_date FROM task_instance WHERE dag_id='<你的DAG ID>' ORDER BY start_date DESC;
    
    看多次触发的任务是否属于同一dag_run_id,以及状态是RUNNING还是UP_FOR_RESCHEDULE

4. 排查DAG调度与任务超时配置

  • 确认DAG的schedule_interval:如果是短间隔(如@hourly),可能是Scheduler触发了新的DAG Run,而非同一Run下的重试
  • 检查PythonOperator的execution_timeout:如果代码里单独设置了更短的超时(比如execution_timeout=timedelta(minutes=2)),会覆盖全局task_timeout配置

5. 排查Scheduler扫描逻辑与DAG文件状态

  • dag_dir_list_interval=300是Scheduler扫描DAG文件的间隔,若任务运行期间DAG文件被修改(如Git同步、CI/CD部署),Scheduler会重新解析DAG,可能导致任务状态异常
  • 查看Scheduler日志,搜索Detected zombie task或Marking task as UP_FOR_RESCHEDULE,这类日志会直接说明触发原因

6. 任务代码层面排查

  • 循环调用REST接口时,是否捕获了异常但未正确处理?比如捕获Exception后未终止任务,导致进程进入假死状态
  • 检查系统日志(如/var/log/messages或dmesg),看是否有OOM Killer杀死任务进程的记录——系统层面杀掉进程后,Scheduler会重新触发任务

内容的提问来源于stack exchange,提问作者nismoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:48:24