DST之后,AirFlow DAG运行两次

时间:2019-11-28 13:01:25

标签: python airflow airflow-scheduler

我正在使用以下逻辑在运行时更新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)

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

谢谢!

2 个答案:

答案 0 :(得分:1)

Airflow documentation说:

  

如果您设置了cron时间表,Airflow会假设您始终希望完全在同一时间运行。然后它将忽略夏令时。因此,如果您有一个时间表说每天在间隔08:00 GMT + 1时运行,则无论是否设置了夏时制,它总是在间隔08:00 GMT + 1时运行。

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

答案 1 :(得分:1)

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

正如您所发现的那样,更改时间表间隔以尝试模仿此缺少的功能是有问题的,因为

  

更改计划间隔通常需要更改dag_id,因为以前运行的TaskInstances不会与新的计划间隔[1]保持一致

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