从 Airflow 1.10 开始,时区感知 DAG 可以使用时区感知 datetime 对象来指定 start_date 来定义。要让 Airflow 始终在同一时间安排 DAG 运行(不管可能的夏令时切换),请使用 cron 表达式指定 schedule_interval。要使 Airflow schedule DAG 以固定的时间间隔运行(不管可能的夏令时切换),请使用 datetime.timedelta() 指定 schedule_interval。
例如,考虑以下代码,首先使用一个 cron 表达式来安排两个连续的 DAG 运行,然后使用一个固定的时间间隔来做同样的事情。
import pendulum
from airflow import DAG
from datetime import datetime, timedelta
START_DATE = datetime(
year=2019,
month=10,
day=25,
hour=8,
minute=0,
tzinfo=pendulum.timezone('Europe/Kiev'),
)
def gen_execution_dates(start_date, schedule_interval):
dag = DAG(
dag_id='id', start_date=start_date, schedule_interval=schedule_interval
)
execution_date = dag.start_date
for i in range(1, 3):
execution_date = dag.following_schedule(execution_date)
print(
f'[Run {i}: Execution Date for "{schedule_interval}"]:',
dag.timezone.convert(execution_date),
)
gen_execution_dates(START_DATE, '0 8 * * *')
gen_execution_dates(START_DATE, timedelta(days=1))
运行代码会产生以下输出:
[Run 1: Execution Date for "0 8 * * *"]: 2019-10-26 08:00:00+03:00
[Run 2: Execution Date for "0 8 * * *"]: 2019-10-27 08:00:00+02:00
[Run 1: Execution Date for "1 day, 0:00:00"]: 2019-10-26 08:00:00+03:00
[Run 2: Execution Date for "1 day, 0:00:00"]: 2019-10-27 07:00:00+02:00
对于 [欧洲/基辅] 区域,2019 年的夏令时于 2019 年 10 月 27 日 03:00:00+03:00 结束。也就是说,在我们的示例中,在 Run 1 和 Run 2 之间。
前两个输出行显示,对于使用 cron 表达式安排的 DAG 运行,第一次运行和第二次运行都安排在 08:00(尽管在不同的时区:东欧夏令时间 (EEST) 和东欧时间(EET))。
最后两行输出显示,对于以固定间隔安排的 DAG 运行,第一次运行安排在 08:00 (EEST),第二次运行安排在 1 天(24 小时)之后,即由于夏令时切换,07:00 (EET)。
下图举例说明: