代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

在气流中使用cron计划时如何考虑夏令时

  •  1
  • Scott Skiles  · 技术社区  · 6 年前

    在Airflow中,我希望作业在非UTC时区中每天的特定时间运行。我怎么安排这个?

    问题是,一旦夏令时被触发,我的工作要么运行得太早一个小时,要么运行得太迟一个小时。 In the Airflow docs ,似乎这是一个已知的问题:

    在同一时间运行。它将忽略白天的节省 时间。因此,如果您有一个时间表,上面写着run at end of interval GMT+1,无论是否有白昼节约时间。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  8
  •   SergiyKolesnikov    5 年前

    datetime 要指定的对象 start_date schedule_interval . 要使气流计划DAG以固定的间隔运行(无论是否使用夏令时开关),请使用 datetime.timedelta() 指定 .

    例如,考虑以下代码:首先,使用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。也就是说,在我们的示例中,在运行1和运行2之间。

    最后两条输出行显示,对于按固定间隔计划的DAG运行,第一次运行计划在08:00(EEST)进行,第二次运行计划正好在1天后(24小时)进行,由于夏时制时间切换,这是在07:00(EET)进行。

    下图说明了该示例:

    enter image description here