You need to enable JavaScript to run this app. Airflow v1.10.12配置@once仅运行一次调度后DAG未触发问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Airflow v1.10.12配置@once仅运行一次调度后DAG未触发问题咨询

Airflow v1.10.12 下 @once 调度不触发的原因与解决方案

核心问题本质

@once属于一次性触发类型的调度,和@hourly、@daily这类周期调度的触发逻辑存在本质区别:

  • 周期调度的触发规则是从固定start_date开始,按预设周期滚动计算下一个未来的触发时间点,只要计算出的触发点在当前时间之后,就会排队生成DAG运行实例,不受start_date过去时长的影响。
  • @once的唯一触发点就是start_date对应的精确时刻,不会滚动生成新的触发点。当你把start_date硬编码为远早于当前部署时间的2020-05-01,同时配置catchup=False时,调度器扫描到这个唯一的触发点已经在过去很久,且被规则判定为无需补跑历史任务,就会直接跳过,不会再主动生成运行实例。
    这也是为什么你把schedule_interval改成@hourly后DAG可以正常触发——周期调度会自动对齐到当前时间之后的下一个执行点。
    额外说明:Airflow v1.10.12版本的@once调度存在已知逻辑缺陷,即便将start_date设置为未来时间,调度器也经常不会将这个一次性触发点加入待执行队列,属于版本本身的实现问题。

排查步骤

  • 执行命令airflow dags next-run airflow_spark_dag,查看调度器识别到的下一次运行时间:如果输出为None,说明调度器根本没找到需要触发的执行点,符合上述逻辑判定。
  • 检查DAG的激活状态:执行airflow dags list | grep airflow_spark_dag,确认输出的DAG条目为active状态,而非paused。
  • 排查调度器日志:在Airflow调度器对应的日志目录中,过滤对应DAG的日志,确认没有出现DAG解析报错的情况——如果存在解析错误,就算配置正确也不会触发。

可落地的解决方案

  • 调整start_date配置,替换硬编码的远期过去时间。比如给start_date加一个5分钟的相对缓冲:
    from datetime import datetime, timedelta
    default_args = {
        'owner': 'airflow',
        'start_date': datetime.now() - timedelta(minutes=5),
        'email': ['your_email@somecompany.com'],
        'email_on_failure': False,
        'email_on_retry': False
    }
    
    这种配置下,@once的触发点会落在调度器的最近扫描窗口内,配合catchup=False会正常触发一次运行,不会被判定为过期任务跳过。
  • 优先采用手动触发替代自动调度逻辑。如果你的核心需求就是让DAG只运行一次,完全可以在DAG取消暂停后,执行命令airflow trigger_dag airflow_spark_dag手动拉起一次运行;后续因为@once的配置,调度器不会再自动生成重复的运行实例,既避开了版本的逻辑bug,也能完全满足只跑一次的效果。
  • 临时过渡方案:如果坚持依赖调度器自动触发,可以临时把schedule_interval改成1分钟粒度的cron表达式*/1 * * * *,待第一次运行成功后,再手动把schedule_interval改回@once,后续调度器就不会再重复触发了。

内容的提问来源于stack exchange,提问作者D86658

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 14:06:04