Airflow DAG使用CRON'30 20 * * 2,3'不运行,如何配置周二周三调度?
你遇到的问题核心是Airflow的cron表达式解析默认匹配实例配置的时区(你这里是UTC),你写的30 20 * * 2,3对应的是UTC时间每周二、周三20:30,和你预期的本地时区时间不一致,所以不会按时触发。除此之外DAG的start_date配置错误、catchup参数设置不当也可能导致调度不触发。
解决方案
1. 直接调整cron表达式适配UTC时区
如果你不打算修改时区配置,只需要把你预期的本地时间换算为UTC时间,更新schedule_interval即可。
比如你需要的是北京时间(UTC+8)每周二、周三20:30运行,对应UTC时间为每周二、周三12:30,直接设置即可:schedule_interval='30 12 * * 2,3'
注:Airflow cron的星期取值规则为0/7代表周日、1代表周一、2代表周二、3代表周三,星期取值与时区无关,无需调整
2. 单独为DAG配置目标时区(推荐,Airflow 2.0+支持)
不需要修改全局配置,只需要在DAG定义时指定时区,cron表达式就会按照你指定的时区解析,示例代码如下:
import pendulum from airflow import DAG from airflow.operators.bash import BashOperator with DAG( dag_id="your_target_dag_id", schedule_interval="30 20 * * 2,3", # 替换为你实际使用的时区,国内常用Asia/Shanghai start_date=pendulum.datetime(2024, 1, 1, tz="Asia/Shanghai"), catchup=False, tags=["your_tag"] ) as dag: test_task = BashOperator( task_id="test_task", bash_command="echo 'task run successfully'" )
3. 全局修改Airflow默认时区
如果所有DAG都需要使用非UTC时区调度,可以修改airflow.cfg配置文件:
找到core配置段,修改default_timezone参数:
[core] default_timezone = Asia/Shanghai
修改完成后重启Airflow scheduler和webserver服务即可生效。
配置生效校验项
修改配置后需要确认以下几点,避免调度异常:
- DAG的
start_date必须早于你期望的首次调度时间,比如你期望2024年5月21日(周二)首次运行,start_date需要设置为2024年5月20日或更早 - 修改DAG配置后可以在Airflow webUI的DAG详情页查看
Next Run时间,确认是否符合预期 - 如果不需要回溯历史任务,务必将
catchup参数设置为False
内容的提问来源于stack exchange,提问作者bob kevin
相关产品推荐
相关产品推荐

