Airflow调度器持续标记无心跳任务失败,UI任务状态停滞
解决Airflow任务卡住并持续输出"Failing jobs without heartbeat"日志的问题
首先,咱们先拆解下你遇到的问题:调度器反复输出“Failing jobs without heartbeat”,同时UI上任务一直停留在running状态,这通常意味着调度器没有收到任务的心跳信号——它认为任务已经挂掉,但实际可能任务还在运行、或者已经崩溃但状态没更新,也可能是元数据存储的问题导致心跳记录异常。
下面是具体的排查和解决步骤,包含你关心的参数配置调整:
1. 先确认任务进程的实际状态
日志里已经给出了任务的PID(比如PID=58141),你可以在终端执行以下命令检查进程是否还存活:
ps -ef | grep <PID>
- 如果进程已经不存在:说明任务在执行过程中崩溃了,但Airflow没正确更新状态。这种情况可以直接清理该任务的运行记录,重新触发。
- 如果进程还在运行:那问题出在任务心跳无法上报给调度器,需要调整心跳相关配置或者排查元数据库连接。
2. 调整心跳超时相关的配置参数
你可以修改airflow.cfg文件里的以下参数,适配你的运行环境:
task_heartbeat_sec:任务向调度器发送心跳的间隔,默认是60秒。如果你的任务执行时间较长或者服务器性能一般,可以适当调大这个值(比如设为120),避免调度器误判任务失联。job_heartbeat_sec:调度器自身的心跳间隔,默认5秒,一般不需要改动,但如果服务器负载高,可以适当调高到10秒。dagrun_timeout:设置整个DAG运行的超时时间,比如dagrun_timeout = 1h,这样即使任务卡住,到时间后也会自动标记为失败,避免一直卡在running状态。- 如果使用的是CeleryExecutor,还要检查
worker_heartbeat_sec(Worker向调度器发送心跳的间隔),默认是15秒,可根据情况调整。
修改完配置后,记得重启Airflow调度器和Worker(如果用了分布式Executor):
airflow scheduler restart airflow worker restart # 仅当使用CeleryExecutor时需要
3. 检查元数据库连接是否正常
Airflow的任务状态和心跳记录都存在元数据库(比如PostgreSQL、MySQL)里,如果数据库连接不稳定或者权限不足,会导致心跳无法正常写入/读取,进而引发调度器误判。
- 验证
airflow.cfg里的sql_alchemy_conn配置是否正确,执行以下命令测试连接:
airflow db check
- 如果连接失败,检查数据库服务是否正常运行、账号密码是否正确、网络是否通畅。
4. 手动清理异常任务
如果以上步骤都试过,任务还是卡在running状态,可以用Airflow CLI命令强制清理任务状态:
# 清理指定DAG的所有任务实例,替换成你的执行日期 airflow tasks clear tutorial -s 2018-05-28T12:13:48 # 或者单独标记某个任务为失败 airflow task fail tutorial <your_task_id> 2018-05-28T12:13:48
清理后重新触发任务,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者pkgajulapalli
相关产品推荐
相关产品推荐

