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。
谢谢!
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 表达式来实现您想要的计划间隔。
我正在 运行 时间用这样的逻辑更新我的 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。
谢谢!
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 表达式来实现您想要的计划间隔。