You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow如何配置DAG每日指定时间准时触发执行

问题原因

Airflow核心调度逻辑为:DAG Run 永远在对应调度周期结束后触发。比如设置schedule_interval="0 10 * * *"(每日10点调度),对应2024-05-20的任务,会在2024-05-21 10:00才触发,运行时的execution_date为2024-05-20,这就是你配置days_ago(1)时任务始终滞后一天的原因。

你之前的配置不生效的具体原因:

  • 用days_ago(0)作为start_date,相当于开始时间是当日0点,当日10点的调度周期还未结束,需要等到次日10点才会触发,所以当日不会运行
  • 配置固定历史start_date未触发,大概率是时区不匹配、或者catchup参数关闭导致历史任务不会补跑

解决方案

方案1:常规配置实现当日触发

如果要部署当日10:30就触发首次运行,按如下配置即可:

from datetime import datetime, timedelta
import pytz

# 替换为你Airflow实例对应的时区,国内常用Asia/Shanghai
local_tz = pytz.timezone('Asia/Shanghai')
# 动态计算start_date:取当日调度时间,往前推1天
start_date = datetime.now(local_tz).replace(hour=10, minute=30, second=0, microsecond=0) - timedelta(days=1)

with DAG(
    "test",
    default_args=default_args,
    description="test",
    schedule_interval="30 10 * * *",
    start_date=start_date,
    catchup=False, # 必须关闭,避免补跑不需要的历史任务
    tags=["goodie"]) as dag:

方案2:Airflow 2.2+ 更直观的调度配置

如果你不想理解底层调度逻辑,可以用2.2版本后新增的CronTriggerTimetable,写法更符合常规cron的使用直觉:

from datetime import datetime
from airflow.timetables.trigger import CronTriggerTimetable

with DAG(
    "test",
    default_args=default_args,
    description="test",
    schedule=CronTriggerTimetable("30 10 * * *", timezone="Asia/Shanghai"),
    start_date=datetime(2024,1,1),
    catchup=False,
    tags=["goodie"]) as dag:

只要部署时间早于当日10:30,到点就会自动触发当日任务,无需手动计算时间差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 00:54:04