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
相关产品推荐
相关产品推荐

