Airflow2.0.0 SSHOperator执行Spark任务成功却因PID不匹配触发SIGTERM失败
问题诱因
- Airflow 2.0.0版本的LocalExecutor存在已知PID校验bug:任务启动时监控进程会记录当前任务的PID,若任务运行时间过长、Docker容器内PID发生复用、或者worker进程出现轻量重启,就会出现监控进程存储的PID和实际运行的任务PID不匹配的情况,监控逻辑会误判任务已经异常逃逸,主动发送SIGTERM信号终止任务,这是本次报错的核心原因。
- 自定义封装的LatamSSHOperator缺少异常兼容逻辑:收到SIGTERM信号后直接抛出异常终止运行,没有回查远端Spark任务的实际状态,导致即使YARN侧任务运行成功,Airflow侧任务仍然被标记为失败。
修复方案
- 升级Airflow版本:该PID校验bug在Airflow 2.0.1及后续版本已被官方修复,升级到稳定的2.x高版本即可从根源解决误杀问题。
- 调整LocalExecutor配置(临时兼容方案,适合暂时无法升级版本的场景):
- 调大
airflow.cfg中[local_task_job]下的task_heartbeat_sec参数,降低PID校验的频率,减少误判概率 - Docker部署时关闭容器PID namespace复用,避免PID快速复用触发校验错误
- 调大
- 优化自定义SSHOperator逻辑:
- 增加SIGTERM信号捕获逻辑,收到终止信号后不要直接抛错退出,先通过YARN接口回查对应Spark任务的实际运行状态,若任务已成功则正常返回,仅当任务实际失败时才抛出异常
spark-submit提交任务时记录YARN应用ID,用于后续状态回查
- 调整任务超时配置:检查SSHOperator的
timeout参数、DAG/任务级别的execution_timeout参数,根据Spark任务的实际最大运行时长调大超时阈值,避免任务被超时逻辑主动终止。
内容的提问来源于stack exchange,提问作者Alejandro Kaspar
相关产品推荐
相关产品推荐

