Airflow DAG执行停滞,触发[heartbeat]错误求助
排查Airflow任务持续Running且日志输出Heartbeat的问题
核心排查方向
1. 验证LocalExecutor配置有效性
- 检查
airflow.cfg关键配置项:- 确认
executor = LocalExecutor sql_alchemy_conn指向正确的MySQL实例parallelism、dag_concurrency、max_active_tasks_per_dag设置合理(避免因资源限制导致任务挂起)
- 确认
- 重启Airflow Webserver和Scheduler后,查看Scheduler日志,确认是否有
Starting LocalExecutor输出,无该日志则说明配置未生效,需检查cfg文件路径是否正确(比如启动时未指定自定义配置路径)
2. 排查MySQL连接与锁机制
- 调整MySQL的
wait_timeout和interactive_timeout为86400(24小时),避免连接被主动断开 - 执行SQL查询运行中任务的进程ID:
用SELECT task_id, pid FROM task_instance WHERE state = 'running';ps aux | grep <pid>验证进程是否真实存在,若进程已消失,说明任务进程异常退出但Airflow未检测到,可手动更新任务状态后排查进程崩溃原因 - 确认MySQL事务隔离级别为
READ COMMITTED,执行SELECT @@tx_isolation;检查,不符则修改MySQL配置
3. 定位任务HTTP请求问题
- 终端测试成功但UI触发失败,大概率是环境变量差异:Scheduler进程缺失终端中存在的代理、认证等环境变量(如
HTTP_PROXY、API_KEY),对比两者env输出补全变量 - 给HTTP请求添加超时限制,避免无限等待:
import requests from airflow.exceptions import AirflowFailException def http_task_func(): try: resp = requests.get("your-target-endpoint", timeout=30) resp.raise_for_status() return resp.json() except requests.exceptions.RequestException as e: raise AirflowFailException(f"HTTP请求失败: {str(e)}")
4. 检查Scheduler与子进程状态
- 确认Scheduler进程正常运行:
ps aux | grep airflow scheduler或systemctl status airflow-scheduler(systemd环境) - 验证服务器资源(CPU、内存)是否充足,避免因资源耗尽导致子进程无法启动或挂起
- 查看Scheduler日志,排查是否存在
Error executing task或子进程启动失败的报错信息
5. 确认版本兼容性
- 检查MySQL与Airflow版本匹配:Airflow 2.x要求MySQL 5.7+或8.0+,版本不兼容可能引发状态同步异常
- 尝试升级Airflow至最新稳定版(如2.8.x),排查是否为已知版本bug导致的任务状态异常
内容的提问来源于stack exchange,提问作者Sri_Dev
相关产品推荐
相关产品推荐

