为何运行最简Airflow DAG时会出现两次运行情况?
为什么你的Airflow DAG会运行两次?
针对你遇到的一次非外部触发(调度器自动触发)、一次外部触发的情况,常见原因和排查方向如下:
1. 误操作导致的手动触发
你可能在部署DAG后,不小心点击了Airflow UI中的触发DAG按钮(界面右上角的播放图标),或者通过Airflow CLI执行了airflow dags trigger simplest_tutorial命令,这会生成一次外部触发的运行实例;同时调度器按照你设置的schedule=timedelta(days=1)规则,自动触发了一次符合调度周期的运行,最终出现两次运行记录。
2. 调度器的初始触发逻辑
当DAG首次被Airflow调度器加载时,即使设置了catchup=False,调度器会计算最近一次应该触发的execution_date(即当前时间往前推一个调度周期的时间点),并自动触发一次运行(这属于非外部触发)。如果此时你刚好手动触发了一次,就会出现两次运行。
另外,如果你在部署DAG后重启过调度器,调度器重新解析DAG时也可能重复触发这次初始运行。
3. 旧版本Airflow的调度bug
如果你使用的是Airflow 2.x早期版本(比如2.0.x-2.2.x),部分版本存在catchup=False场景下调度器重复触发的bug,导致自动生成多次运行实例。这种情况可以通过升级到较新的稳定版本(比如2.5+)来解决。
排查和验证方法
- 查看Airflow UI中的审计日志:重点查找
trigger相关记录,若存在User: <你的用户名>触发的记录,说明是手动触发;如果触发来源是Scheduler,则是调度器自动触发。 - 检查DAG的
execution_date:调度器自动触发的实例,其execution_date通常是当前时间往前推一个调度周期(比如今天运行的话,execution_date是昨天);而手动触发的实例,execution_date一般是触发时的时间(或你手动指定的时间)。
解决建议
- 避免误点击UI中的触发按钮或执行触发命令,若不需要手动触发则完全禁用该操作;
- 确认Airflow版本,若为旧版本,考虑升级到官方稳定版;
- 若想完全避免初始自动触发,可以临时将
schedule=None,部署后再改回timedelta(days=1),或者等待调度器完成初始解析后再启用DAG。
内容的提问来源于stack exchange,提问作者Kansai Hitoruna
相关产品推荐
相关产品推荐

