Airflow Scheduler调度延迟一周 DAG每周一调度不触发如何解决
问题根因
这两个问题的核心根因都是Airflow特有的调度逻辑和常规crontab定时逻辑的差异:
- Airflow的DAG运行实例的
execution_date对应调度周期的起始时间,实例的实际触发时间是该调度周期完全结束之后。你配置的schedule_interval='0 8 * * 1'为周粒度调度,意味着execution_date为某周周一的实例,会在下周周一的8点才会被自动触发。 - 两个问题的具体对应逻辑:
- 从未自动触发:通常是DAG配置的
start_date距离当前时间不足一个完整调度周期。比如你将start_date设为2021-10-11(周一),那么第一次自动触发的时间点是2021-10-18 8点,在这个时间点之前不会有自动运行的实例。如果你的start_date设置的更早且开启了catchup=True,还会因为历史实例积压阻塞新的调度。 - 手动触发默认执行上周任务:手动触发DAG时,Airflow默认会填充最近一个未完成调度的
execution_date,这个日期是对应周期的起始时间,自然会显示为上周周一的日期,你2021年10月21日手动触发时看到的9月11日实例,本质是中间积压的未调度历史实例。
- 从未自动触发:通常是DAG配置的
修复方案
- 调整
start_date配置:使用固定的过去时间作为start_date,不要使用动态的当前时间。比如你希望第一次实际运行时间为10月25日(周一)8点,就将start_date设为datetime(2021, 10, 18, 8, 0, tzinfo=你的时区),时区要和调度时间的时区保持一致,避免时区偏移导致的调度异常。 - 关闭历史补跑:在DAG参数中添加
catchup=False,禁止Airflow调度start_date到当前时间之间所有缺失的历史实例,避免实例积压。 - 手动触发时自定义日期:如果需要手动触发对应时间的任务,不要使用默认填充的
execution_date,手动指定你需要的日期即可。 - 适配调度逻辑(可选):如果你需要
execution_date和实际运行时间保持一致,可以使用Airflow 2.3+版本提供的自定义Timetable功能调整调度规则,或者调整schedule_interval的配置适配你的使用习惯。
内容的提问来源于stack exchange,提问作者Peterson Davis
相关产品推荐
相关产品推荐

