首页/数据/数据工程与 ETL 速查/Airflow 任务状态机

Airflow 任务状态机

任务实例经历 queued 到 running 再到 success 或 failed,还有 up_for_retry、upstream_failed、skipped、deferred;排障顺序是先读状态再读日志。

任务状态机是什么

Airflow 的每个任务实例都处在一个确定状态:进入队列是 queued,开始执行是 running,结束时是 success 或 failed,失败重试中为 up_for_retry,等待资源为 scheduled,因上游失败为 upstream_failed,被分支跳过为 skipped,交给 deferrable 算子处理为 deferred。排障顺序是先读状态再读日志——状态直接告诉你该往哪查,日志只告诉你这一次执行发生了什么。

基本信息

运行态queued(排队)、running(执行中)、deferred(延迟等待触发)
终态success、failed、skipped、upstream_failed
重试态up_for_retry(等待重试)、up_for_reschedule(等待条件检查)
调度的前置态scheduled(计划中)、queued(已入队)
查询命令airflow tasks states-for-dag-run、airflow tasks list、airflow dags list-runs
查看原因airflow tasks failed-deps 可查看上游为何阻止执行

典型使用场景

  • 任务加厚排查:确定是卡在队列(资源不足)还是卡在执行(业务慢)
  • 重试判断:up_for_retry 说明重试次数还没用完,failed 才是真正耗尽
  • 依赖排查:upstream_failed 时无需看本任务日志,直接查上游
  • 跳过确认:skipped 通常来自分支,不是故障
  • 运行核对:用 list-runs 与状态过滤确认某个业务日期是否完整跑完

按状态排查

按状态排查
# 查看某次运行里所有任务的状态(最快的一次总览)
airflow tasks states-for-dag-run daily_orders scheduled__2026-10-11T00:00:00+08:00

# 查看某次运行的任务清单与状态,定位失败项
airflow tasks list daily_orders --tree

# 查上游为何阻止本任务执行
airflow tasks failed-deps daily_orders load_dwd 2026-10-11

# 确认重跑:清理指定区间任务状态后重新调度(选项名以所用版本为准)
airflow tasks clear daily_orders -s 2026-10-11 -e 2026-10-11 -t load_dwd

状态读法

状态含义下一步动作
queued已排队等待执行槽位查执行器与资源池是否被占满
running正在执行看运行时长与日志,判断是否卡在外部系统
up_for_retry失败后等待重试查是否属可自愈的临时故障
failed执行失败且重试耗尽读日志定位根因后重跑
upstream_failed因上游失败而未能执行转去排查上游任务
skipped被分支或规则跳过确认分支条件是否符合预期
deferred已让出 worker 等待触发确认触发条件是否按期满足
状态为 upstream_failed 时看本任务日志没有意义:它根本没有执行过,问题在上游。这也是很多人白查一小时的原因。
直接清理任务状态会让该区间重新调度,若下游已产出数据可能与新结果混写;重跑前先确认目标分区可被覆盖写。

易错点

  • 把 queued 当成执行慢来排查,实际是执行槽位不足,查日志毫无收获
  • upstream_failed 时反复检查本任务日志,浪费时间且找不到根因
  • deferred 长期停留无人关注,任务既不算失败也不产出数据
  • 清理任务状态后未确认分区写入方式,重跑结果与已有数据混在一起
  • 只看最终 success 就认为数据正确,忽略了任务内部吞掉异常的情况

数据来源与参考

  • Apache Airflow 官方文档:Task Instances 与 States
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌