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
相关产品推荐
相关产品推荐

