首页/数据/数据工程与 ETL 速查/Airflow Sensor 等待与 reschedule 模式

Airflow Sensor 等待与 reschedule 模式

Sensor 是等条件成立的任务:文件出现、上游分区就绪、时间到达等;默认 poke 模式会一直占用执行槽位,长等待建议开 reschedule 模式在轮询之间释放资源。

Sensor 是做什么的

Sensor 是一类「等到条件成立才继续」的任务:等文件出现、等上游分区可查、等到某个时间点。它的关键配置是运行模式:poke 模式会按间隔反复检查,期间一直占着执行槽位;reschedule 模式则在两次检查之间释放槽位,由调度器到点再唤醒。等待时间长的场景如果不改成 reschedule,几个 Sensor 就能把 worker 槽位占满,让其他任务排队。

基本信息

常见 SensorFileSensor / ExternalTaskSensor / 各系统分区 Sensor
poke 模式按 poke_interval 轮询并占住槽位
reschedule 模式轮询间释放槽位,由调度器再唤醒
超时控制timeout 到点任务失败
其他参数mode、poke_interval、soft_fail、deferrable
替代方案数据集/事件触发机制,避免轮询

reschedule 用法

reschedule 用法
from airflow.sensors.filesystem import FileSensor

wait_file = FileSensor(
    task_id="wait_file",
    filepath="/data/in/{{ ds }}.done",
    poke_interval=60,          # 每 60 秒检查一次
    timeout=60 * 60 * 6,       # 最多等 6 小时
    mode="reschedule",         # 等待期间释放执行槽位
)

典型使用场景

  • 等待上游文件:对方系统落 _SUCCESS 文件后再开始加工
  • 等待分区就绪:轮询目标分区是否存在且有数据
  • 跨 DAG 等待:等另一个 DAG 的同周期任务完成
  • 等待外部系统:确认接口可用或第三方数据到达
  • 限时人工确认:等待人工放行按钮,超时后失败并告警
  • 环境探测:等依赖服务健康检查通过再提交下游任务

两种模式对比

模式占槽位适用
poke一直占用等待时间短(分钟级)
reschedule轮询间释放等待时间长(小时级)
deferrable交给触发器进程需要更细粒度资源控制时
超时后行为任务失败并告警soft_fail 可改为跳过
大量 Sensor 用 poke 模式会把执行槽位占满,导致其它任务排队——长等待统一改 reschedule。
轮询间隔不是越小越好:间隔过密会给元数据库或被检查的外部系统带来持续压力,通常按上游实际产出节奏来设。
Sensor 的超时时间要和上游的承诺产出时间对齐:承诺 03:00 出数,超时就不该设成 02:30,否则每天都会失败告警造成告警疲劳。

易错点

  • mode 默认是 poke,复制代码时容易漏改
  • 超时时间设得过短,上游晚到就直接失败,凌晨批量场景尤其明显
  • 轮询间隔设成几秒,元数据库压力骤增
  • Sensor 检查条件写得太宽(只看目录存在不看文件可用),读到半成品数据
  • 任务失败后没有告警,Sensor 长时间「等待中」无人发现

数据来源与参考

  • Apache Airflow 官方文档:Sensors
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌