首页/数据/数据工程与 ETL 速查/Airflow 数据集驱动调度

Airflow 数据集驱动调度

数据集(Airflow 2.4 引入的 Dataset,3.x 改名 Asset)把上游产出更新作为下游 DAG 的触发条件,替代按时间硬对齐的 cron;同一数据集被多个 DAG 更新时,下游等齐所有更新才触发。

数据集驱动调度是什么

数据集(Airflow 2.4 引入的 Dataset,3.x 改名 Asset)把「上游产出了什么」作为下游 DAG 的触发条件,替代按时间硬对齐的 cron 表达式。生产任务用 outlets 声明自己产出某个数据集,下游 DAG 把该数据集写进 schedule,一旦有任务更新这个数据集就会触发一次下游运行。同一数据集被多个 DAG 更新时,下游会等所有更新到齐才触发,这正好解决了「上游不定时完成」的对齐难题。

基本信息

版本差异Airflow 2.4 起为 Dataset,3.x 中更名为 Asset
声明方式下游 DAG 的 schedule 传数据集列表
生产者标记任务参数 outlets 声明该任务产出哪些数据集
触发语义数据集被更新即产生一次下游运行;多个上游等齐再触发
与 Sensor 差异不依赖上游任务状态与逻辑日期对齐,只看产出是否更新
兜底要求仍需配超时告警,防止上游整天无产出导致下游静默不跑

典型使用场景

  • 上游不定时完成:源端文件到点不定,产出即触发下游,无需按点轮询
  • 多上游汇聚:多个上游 DAG 都产出同一数据集,等齐后再跑下游汇总
  • 跨团队交接:以数据集为接口约定,减少对彼此调度时间的依赖
  • 替代高频轮询:不再频繁检查上游状态,降低调度器与元数据压力
  • 产出驱动的推送链路:上游完成即推,缩短端到端延迟

数据集声明示例

数据集声明示例
# 生产者:任务用 outlets 声明产出的数据集
@task(outlets=[orders_ds])
def produce_orders():
    pass

# 消费者:DAG 以数据集为触发条件
@dag(schedule=[orders_ds], start_date=datetime(2026, 1, 1))
def downstream():
    pass

核对触发链路

核对触发链路
# 查看数据集定义与关联的 DAG(命令名随版本略有差异)
airflow datasets list
# 查看由数据集触发的运行记录,确认是否按期产生
airflow dags list-runs -d downstream | head

两种触发方式对照

对比数据集驱动定时与 Sensor
触发依据上游是否更新了数据集时间点或上游任务状态
上游不定时天然适配,产出即触发需要轮询或改调度时间
逻辑日期对齐不依赖日期映射频率不同需自定义映射函数
轮询开销无轮询,事件驱动轮询会持续占用或反复检查
失效表现下游完全不触发,无报错Sensor 超时后才失败
数据集标识写错(路径或命名空间与生产者不一致)会让下游永远不触发,而且不会报错:排查这类「什么都不跑」的问题时,先核对生产者的 outlets 与下游 schedule 是否指向同一个标识。
数据集触发只说明产出动作发生了,不校验内容是否正确:数据是否为空、是否完整仍要靠行数比对与质量规则来兜底。

易错点

  • 数据集标识不一致(路径或命名空间写错),下游永不触发且没有明显报错
  • 把数据集触发当成数据正确的保证,产出为空也会照常触发下游
  • 未配兜底超时告警,上游整天无产出时下游静默不跑,业务看报表才发现
  • 同一数据集被大量 DAG 更新,任何一次更新都触发下游,运行次数远超预期
  • 版本升级时未同步改写相关代码,升级后 DAG 解析失败

数据来源与参考

  • Apache Airflow 官方文档:Data-aware scheduling(Datasets / Assets)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌