配置为每3天运行的Airflow DAG未按预期触发是什么原因?
配置错误原因
- cron表达式语义理解偏差
你使用的0 15 */3 * *cron表达式中,日期位的*/3代表每月所有能被3整除的日期(1、4、7...24、27、30)的15点执行,而非从start_date开始向后每隔3天执行。按该规则,你设置的起始时间为2021年5月24日,下一个符合规则的时间点是2021年5月27日15:00,和你预期的2021年5月28日不符。 - Airflow调度逻辑不匹配
Airflow采用「调度周期结束后触发」的规则:对应某个execution_date的DAG实例,会在所属调度周期完全结束后才会触发执行。比如你设置的间隔为3天,execution_date为2021-05-24 15:00的任务,实际触发时间为2021-05-27 15:00,若你排查问题时时间还早于该节点,自然看不到触发记录。 - 参数配置冲突
你设置了depends_on_past=True,该参数要求当前任务必须等待上一个同DAG的调度实例运行成功才能启动。同时你配置了catchup=False,不会自动补跑start_date到当前时间之间的所有历史调度实例,首次运行没有历史成功实例作为依赖,也会导致任务无法触发。
修复方案
如果你需要实现的是从start_date开始每隔3天15点执行,而非固定每月被3整除的日期执行,优先使用Airflow的时间间隔对象配置调度规则,修改后的参考代码如下:
from datetime import datetime, timedelta default_args = { 'owner': 'akash', 'depends_on_past': False, # 首次运行建议关闭,若无需依赖历史运行结果可长期保持关闭 'start_date': datetime(2021, 5, 24), 'retries': 1, } dag = DAG( dag_id='au_welcome_bonus_promotion', default_args=default_args, catchup=False, # 时间间隔配置,实现从start_date开始每隔72小时触发一次 schedule_interval = timedelta(days=3) )
如果你需要保留cron写法、接受每月固定能被3整除的日期执行的逻辑,只需将depends_on_past改为False即可正常触发首次运行,后续如果需要依赖历史运行结果再改回True即可。
内容的提问来源于stack exchange,提问作者Muddassir Rahman
相关产品推荐
相关产品推荐

