AirFlow DAG 运行 夏令时后两次

AirFlow DAG running twice after DST

我正在 运行 时间用这样的逻辑更新我的 DAG 的调度程序:

now = time.localtime()
sched_interval = '30 6 * * *' if now.tm_isdst else '30 7 * * *'

dag = DAG(
    'my_dag',
    default_args=args,
    schedule_interval=sched_interval,
    max_active_runs=1,
    catchup=False)

问题是:在夏令时之后,DAG 将触发两次,因为调度程序将更新 1 小时以上。在这种情况下,如何避免 运行 两次?我正在使用 AirFlow 1.9。

谢谢!

Airflow documentation 说:

In case you set a cron schedule, Airflow assumes you will always want to run at the exact same time. It will then ignore day light savings time. Thus, if you have a schedule that says run at end of interval every day at 08:00 GMT+1 it will always run end of interval 08:00 GMT+1, regardless if day light savings time is in place.

这对我来说似乎意味着您不需要测试夏令时,因为它会自动转换。

Airflow 1.9 不提供考虑夏令时的功能。它对时区一无所知,并以 UTC±00:00 运行所有内容。

如您所见,更改计划间隔以尝试模拟此缺失功能是有问题的,因为

Changing schedule interval always requires changing the dag_id, because previously run TaskInstances will not align with the new schedule interval [1]

因此,如果可能,最好的解决方案是至少升级到引入 timezone-aware DAGs 的 Airflow 1.10。然后,您可以通过根据需要设置 DAG 的时区并使用 crone 表达式来实现您想要的计划间隔。