Airflow schedule_interval失效求助:新西兰时区调度未按时触发
解决Airflow时区与调度触发不匹配的问题
我来帮你理清楚这个问题——Airflow的时区配置独立于系统本地时区,你只修改了AWS实例的时区,但Airflow默认还是用UTC来处理调度和部分UI显示,这就是DAG没按时触发的核心原因。下面是一步步的解决方案:
1. 修改Airflow核心配置文件
首先找到你的airflow.cfg配置文件(默认路径是~/airflow/airflow.cfg,如果是Docker部署则在你挂载的配置目录里),修改以下两个关键参数:
# 控制调度器使用的时区,决定Cron表达式的解析基准 default_timezone = Pacific/Auckland # 控制WebUI显示的时区,解决右上角时间显示UTC的问题 default_ui_timezone = Pacific/Auckland
⚠️ 注意:必须使用IANA标准时区名称(比如Pacific/Auckland),不要用NZ或NZST这类缩写,避免歧义。
2. 重启Airflow服务
配置修改后,必须重启相关服务才能生效:
- 如果是用systemd管理的Airflow:
sudo systemctl restart airflow-scheduler sudo systemctl restart airflow-webserver - 如果是Docker Compose部署:
docker-compose restart airflow-scheduler airflow-webserver - 如果你用的是CeleryExecutor,别忘了同时重启Celery Worker:
sudo systemctl restart airflow-worker # 或者Docker环境下 docker-compose restart airflow-worker
3. 验证DAG的调度配置
确保你的DAG调度表达式是基于新西兰时区编写的。你需要每天下午3点和凌晨4点运行,对应的Cron表达式应该是:
schedule_interval = "0 15,4 * * *"
当default_timezone设为Pacific/Auckland后,这个Cron会直接按新西兰时区解析,不需要手动转换为UTC时间。
4. 验证配置是否生效
完成以上步骤后,做几个检查:
- 打开Airflow WebUI,右上角应该显示
Pacific/Auckland时区的时间,不再是UTC。 - 查看DAG的「Next Run」时间,应该符合你设置的下午3点和凌晨4点的周期。
- 用Airflow CLI验证时区:
在输出中找到airflow infoTimezone相关字段,确认显示的是Pacific/Auckland。
额外注意事项
- 已存在的DAG任务实例历史不会自动更新时区,你可以通过清除DAG的任务实例(在WebUI的DAG详情页→「Clear」),让调度器重新计算下一次运行时间。
- 如果你的Airflow版本低于2.0,
default_ui_timezone参数不存在,此时UI会默认使用default_timezone的配置,但建议尽量升级到较新版本以获得更好的时区支持。
内容的提问来源于stack exchange,提问作者ds_user
相关产品推荐
相关产品推荐

