Dataproc集群Airflow任务Retry状态无日志问题排查咨询
故障现象
在Dataproc集群上部署运行的Airflow服务此前所有DAG均可正常调度,近期出现异常:任务进入retry状态时,点击Airflow UI中任务实例的日志入口无法查看任何日志。
启动Airflow webserver的终端可观测到如下报错信息:
2022-06-24 07:30:36.544 [ERROR] Executor reports task instance <TaskInstance: **task name** 2022-06-23 07:00:00+00:00 [queued]> finished (failed) although the task says its queued. Was the task killed externally? None [2022-06-23 06:08:33,202] {models.py:1758} INFO - Marking task as UP_FOR_RETRY 2022-06-23 06:08:33.202 [INFO] Marking task as UP_FOR_RETRY
故障已持续2天,初步推测问题可能与共享数据库有关,但暂未找到明确修复路径。
已尝试操作(均未解决问题)
- 重启webserver服务
- 更换3个不同端口启动服务
- 搭配3组不同时间戳重新执行backfill命令
- 删除目标DAG的历史运行记录,新建DAG运行实例后重新执行backfill命令
- 参考社区指引清理进程PID后重启webserver
问题补充更新
后续观测发现异常任务最终会流转至成功或失败状态,此时可正常查看对应日志,但
$airflow_home本地目录及配置的远程日志存储目录中,始终不存在任务重试阶段的日志记录。
排查解决思路
- 优先排查任务进程异常终止场景:报错信息提示任务可能被外部杀死,结合Dataproc集群特性,先检查执行重试任务的worker节点是否为抢占式实例、是否在任务重试时段发生节点回收,同时查看节点系统日志
/var/log/messages、/var/log/syslog确认是否存在OOM kill记录。进程被系统/云平台强制终止时,不会触发Airflow的日志落盘、远程上传钩子,直接导致重试阶段无日志留存,同时会触发executor上报状态和元数据库记录不一致的报错。 - 校验元数据库状态一致性:直接连接Airflow共享元数据库,查询
task_instance表中对应DAG、对应执行时间的任务记录,重点核对try_number(尝试次数)、hostname(执行任务的worker节点地址)字段值。常见异常为任务第一次失败标记为重试时,worker侧的尝试次数计数和元数据库不同步,导致webserver按照错误的路径、错误的尝试编号查找日志,自然无法获取重试阶段的日志文件。如果确认字段值不匹配,手动修正为和实际执行节点、实际日志编号一致即可恢复。 - 验证日志服务连通性:检查
airflow.cfg中[logging]配置段的worker_log_server_port端口,确认webserver节点到所有worker节点的该端口未被Dataproc防火墙、VPC安全组规则拦截。重试阶段的任务在未进入终态前,webserver不会直接读取本地/远程存储的日志文件,而是通过worker节点上的日志服务实时拉取日志,端口不通时就会显示无日志;等任务进入终态日志被统一上传到存储后,webserver就能正常读取,和观测到的现象完全吻合。 - 排查backfill触发的实例冲突:如果重试是通过backfill命令触发,检查是否存在同一任务同一执行时间的实例被重复拉起的情况。多个worker进程同时操作同一个task instance记录时,会出现executor上报状态和元数据库标记状态不一致的问题,后启动的重试进程会被判定为僵尸进程直接终止,不会产生任何日志留存。可以先通过
airflow tasks clear <dag_id> -s <start_date> -e <end_date>清理对应任务的所有残留记录,关闭重复触发的调度/backfill进程后再验证。
内容的提问来源于stack exchange,提问作者Fremzy
相关产品推荐
相关产品推荐

