Airflow运行实例数与start_date、end_date及interval不符问题求助
Airflow调度逻辑与问题解析
核心逻辑拆解
手动触发的运行是独立任务
你在start_date之前手动点击启动的那次运行,是完全独立于调度器自动任务的手动触发任务——不管start_date设置成什么,手动触发的任务都会立即执行,这就是你看到的“第一次立即触发”的运行,属于额外的一次,不在调度生成的任务范围内。调度器任务生成规则(catchup机制)
Airflow默认开启catchup=True,当你在start_date之前启用DAG时,调度器会自动补全从start_date到end_date之间的所有周期任务。结合你的配置:
start_date=datetime.datetime(2022,7,30,7,33), end_date=datetime.datetime(2022,7,30,7,35), schedule_interval='*/1 * * * *'
调度器会生成2个自动任务:
- execution_date=2022-07-30 07:33:对应周期
[7:33, 7:34),在7:34之后执行 - execution_date=2022-07-30 07:34:对应周期
[7:34, 7:35),在7:35之后执行
你预期的第三次运行(7:36之后)对应的execution_date是2022-07-30 07:35,但Airflow的end_date规则是调度器不会生成execution_date >= end_date的任务,所以这个任务不会被自动生成——你的end_date是7:35,execution_date等于end_date,不符合生成条件。
- 为什么实际出现4次运行?
你看到的4次运行=1次手动触发运行 + 3次调度生成任务,核心原因是手动触发的额外运行导致总数多了一次,可能你还混淆了execution_date和实际运行时间的对应关系,或者调度器在end_date的边界判断上出现了细微偏差。
解决方案
- 如果不需要手动触发的额外运行,不要手动点击启动DAG,仅启用DAG即可,调度器会自动按规则生成任务。
- 如果不想让调度器补全start_date到当前时间的历史任务,在DAG配置中添加
catchup=False,这样调度器只会生成当前时间之后的周期任务。 - 如果想要生成你预期的第三次运行(7:36之后执行),需要将
end_date调整为datetime.datetime(2022,7,30,7,36),这样execution_date=7:35 < end_date,调度器会生成该任务。
内容的提问来源于stack exchange,提问作者K.Suw
相关产品推荐
相关产品推荐

