故障排查
不明任务失败
任务状态被外部更改
任务状态可能被除执行器之外的组件更改的原因有很多,这在查看任务实例或调度器日志时可能会造成混淆。
以下是一些可能导致任务状态被执行器之外的组件更改的示例情形:
如果任务的 DAG 在工作节点上解析失败,调度器可能会将任务标记为失败。如果确认,请考虑增加 core.dagbag_import_timeout 和 dag_processor.dag_file_processor_timeout。
如果任务在队列中的时间超过 scheduler.task_queued_timeout,调度器将把任务标记为失败。
如果 任务实例的心跳超时,调度器会将其标记为失败。
用户在 Airflow UI 中将任务标记为成功或失败。
外部脚本或进程使用 Airflow REST API 更改任务状态。
进程被信号终止
有时,Airflow 或某些关联系统会终止任务实例的 TaskRunner,导致任务实例失败。
下面我们讨论几种常见情况。
DAG 运行超时
可以在 DAG 定义中通过 dagrun_timeout 指定 DAG 运行超时。任务进程可能会被 SIGTERM(退出码 -15)终止。
内存不足错误(OOM)
当任务进程消耗的内存超出工作节点的容量时,最好的情况是它会被 SIGKILL(退出码 -9)终止。根据配置和基础设施的不同,也可能会因 OOM 导致整个工作节点被杀死,随后任务因心跳失败而被标记为失败。
残留的任务监督进程
在极高并发情况下,任务监督进程内部的套接字处理程序可能会错过任务进程的最终 EOF 事件。发生这种情况时,监督进程会认为套接字仍然打开而不退出。workers.socket_cleanup_timeout 选项控制任务完成后监督进程在强制关闭剩余套接字前的等待时间。如果观察到残留的 supervisor 进程,请考虑增加此延迟。