Airflow升级至v1.10.9后Hive相关DAG重试异常求助
我之前维护Airflow集群的时候碰到过几乎一模一样的情况,也是升级到1.10.x版本后,所有Hive相关DAG都出现了心跳丢失、任务重复执行的问题,给你分享几个实际验证有效的排查和解决思路:
1. 优先检查Airflow的心跳超时配置
LocalExecutor模式下,Airflow Scheduler会通过worker进程的心跳来判断任务是否存活。默认的worker_timeout配置是300秒(5分钟),刚好和你描述的“5-6分钟丢失心跳”时间点吻合。如果你的Hive查询运行时间接近或超过这个阈值,且脚本长时间没有输出,Scheduler会误以为worker进程挂了,直接触发重试。
解决方法:
- 修改
airflow.cfg中的worker_timeout参数,延长超时时间,比如设置为6分钟(360秒)或更长:worker_timeout = 360 - 同时可以在Hive执行脚本中添加周期性输出,让Airflow感知到worker进程还在运行:
# 后台启动周期性日志输出 while true; do echo "Hive query is running..." && sleep 60; done & # 执行Hive查询 hive -f your_hive_script.hql # 查询结束后终止后台日志进程 kill $!
2. 添加Yarn作业的自动清理逻辑
Airflow触发重试后,原来的Hive查询会继续在Yarn上运行——因为LocalExecutor的worker进程终止并不会主动终止Yarn上的作业。我们可以在Shell脚本中添加信号捕获逻辑,当任务被终止时自动kill对应的Yarn应用。
示例脚本:
#!/bin/bash # 定义清理函数:终止Yarn上的Hive作业 cleanup_hive_job() { if [ -f ./hive_app_id.txt ]; then APP_ID=$(cat ./hive_app_id.txt) echo "Cleaning up Yarn application: $APP_ID" yarn application -kill "$APP_ID" rm ./hive_app_id.txt fi } # 捕获终止信号,触发清理逻辑 trap cleanup_hive_job EXIT SIGTERM SIGINT # 执行Hive查询并捕获Yarn应用ID hive -f your_hive_script.hql 2>&1 | tee hive_run.log | grep -o 'Application id is [a-zA-Z0-9_]*' | awk '{print $4}' > ./hive_app_id.txt
3. 排查Airflow升级后的配置变更
升级到v1.10.9后,部分默认配置可能和你之前的版本不同。建议对比升级前后的airflow.cfg,重点检查以下参数:
task_instance_timeout:任务实例的超时时间scheduler_heartbeat_sec:Scheduler的心跳间隔parallelism:LocalExecutor的最大并发任务数
如果某些参数被重置为默认值,可能会导致资源竞争或超时逻辑触发异常。
4. 检查系统资源瓶颈
LocalExecutor依赖本地机器的CPU、内存资源,如果升级后集群并发任务数增加,或者机器资源不足,会导致worker进程无法及时汇报心跳,被Scheduler判定为丢失。
可以通过以下命令快速排查资源情况:
# 查看CPU和内存实时占用 top # 查看内存详情 free -h # 查看磁盘IO状态 iostat
如果存在资源瓶颈,可以调整parallelism、max_active_runs_per_dag等参数,降低并发任务数量,避免资源耗尽。
内容的提问来源于stack exchange,提问作者Nitin

