DagRun的execution_date设定规则咨询及实例困惑解答请求
嘿,这两个问题确实是Airflow新手最容易绕晕的点,我给你掰扯清楚!
1. 如何设定DagRun的execution_date?
分三种场景来说,不同触发方式的设置方法不一样:
- 手动触发(UI/命令行)
- 如果你在Airflow UI里手动触发DAG,弹窗里直接有个
Execution Date输入框,选你想要的时间就行; - 用CLI的话,执行命令:
airflow dags trigger -e "2024-05-20 10:00:00" your_dag_id,这里的-e参数就是指定execution_date。
- 如果你在Airflow UI里手动触发DAG,弹窗里直接有个
- 调度器自动生成
这种情况你没法直接设定,execution_date是由DAG的start_date、schedule_interval以及catchup配置自动计算出来的,具体逻辑我在第二个问题里详细说。 - API触发
调用Airflow的REST API时,在请求体里加上execution_date字段,比如:{ "dag_id": "your_dag_id", "execution_date": "2024-05-20T10:00:00+00:00" }
2. 带start_date的DAG,execution_date的定义逻辑
先记住Airflow的核心逻辑:execution_date不是DagRun实际运行的时间,而是它负责处理的时间周期的“锚点”,调度器会在一个时间周期结束后,才会创建对应这个周期的DagRun。
用你提到的官方示例拆解一下:
假设这个DAG的start_date是2016-01-01,schedule_interval是@daily(每天一次):
- 首个DagRun:调度器会在
2016-01-02 00:00(也就是2016-01-01这个周期结束后)才会创建它,它的execution_date是2016-01-01——意思是这个DagRun要处理的是2016-01-01当天的数据。你看到它实际在2016-01-02 6:00运行,大概率是调度器的唤醒间隔、资源排队之类的延迟导致的,但execution_date还是锚定到前一天。 - 下一个DagRun:按照周期,它对应的时间周期是2016-01-02,所以execution_date是
2016-01-02,调度器会在2016-01-03 00:00刚过的时候创建它,实际运行时间也是这个点之后。
再给你补个公式帮你理解:下一次调度时间 = execution_date + schedule_interval
调度器会在“下一次调度时间”到达时,创建并触发对应execution_date的DagRun。
另外提个常见坑:如果你的DAG设置了catchup=False,调度器不会补跑start_date到当前时间之间的所有周期,只会创建当前时间之后的最新周期的DagRun,避免一次性跑大量历史任务。
内容的提问来源于stack exchange,提问作者MassyB
相关产品推荐
相关产品推荐

