Airflow调度器出现TypeError:v1.9中scheduler_interval='@once'用法是否变更?
问题分析与解决方案
嘿,我之前升级Airflow到1.9版本时也碰到过一模一样的问题!你猜的完全没错,问题根源就是scheduler_interval='@once'的逻辑变更。
Airflow 1.9对@once的调度机制做了关键调整:
- 在1.9之前的版本,设置
@once的DAG只要被调度器加载,就会立即触发一次执行,不管start_date是过去还是当前时间。 - 但升级到1.9后,
@once的执行逻辑和其他调度间隔对齐了:它会基于DAG的start_date计算出唯一的执行时间点,如果这个时间点在调度器启动之前,调度器会判定这个一次性任务已经“过期”,不会主动触发它。
针对你的极简DAG,这里有几个快速解决办法:
- 调整
start_date为当前/未来时间:把DAG的start_date改成datetime.datetime.now()或者未来的某个时间点,然后重启Airflow调度器。这样调度器会识别到新的未过期执行点,自动触发一次任务。 - 手动触发DAG:如果不想修改
start_date,直接在Airflow UI里找到这个DAG,点击「Trigger DAG」按钮手动执行——毕竟@once本身就是一次性任务,手动触发完全符合它的设计意图。 - 检查
catchup配置:如果你的DAG设置了catchup=False,结合过去的start_date,调度器会直接跳过补跑逻辑,这也会导致@once任务不触发。可以临时把catchup改成True,等任务执行完成后再改回去。
你还可以去调度器日志里找类似这样的条目验证问题:
INFO - Skipping DAG <你的DAG名称> because start_date is in the past and scheduler_interval is @once
内容的提问来源于stack exchange,提问作者aaron
相关产品推荐
相关产品推荐

