气流:如何安排dag在工作日之后开始新的一天?

时间:2018-04-10 16:45:54

标签: python airflow airflow-scheduler

如何安排dag有一个工作日执行日期,但是第二天有一个开始日期,这不一定是工作日?

我的理由是,我会在每个工作日结束时获取数据,我希望第二天早上能够处理这些数据。气流common pitfalls将执行日期描述为数据所属的日期,而开始日期是您运行ETL的日期。

例如:我希望一系列dag运行具有以下执行和开始日期 -

DAG start_date      Task Started          Task execution_date
2018-01-01          2018-01-02 Tues       2018-01-01 Mon
                    2018-01-03 Wed        2018-01-02 Tues
                    2018-01-04 Thur       2018-01-03 Wed
                    2018-01-05 Fri        2018-01-04 Thur
                    2018-01-06 Sat        2018-01-05 Fri
                    2018-01-06 Tues       2018-01-08 Mon

我设法得到的最接近的是使用时间表0 2 * * TUE-SAT,其执行日期(星期六)在星期二开始时有错误(见下文)

DAG start_date      Task Started          Task execution_date
2018-01-01          2018-01-03 Wed        2018-01-02 Tues
                    2018-01-04 Thur       2018-01-03 Wed
                    2018-01-05 Fri        2018-01-04 Thur
                    2018-01-06 Sat        2018-01-05 Fri
                    2018-01-09 Tues       2018-01-06 Sat

或时间表:0 2 * * MON-FRI星期一没有星期五DAG运行,我需要在周末结果。

DAG start_date      Task Started          Task execution_date
2018-01-01          2018-01-02 Tues       2018-01-01 Mon
                    2018-01-03 Wed        2018-01-02 Tues
                    2018-01-04 Thur       2018-01-03 Wed
                    2018-01-05 Fri        2018-01-04 Thur
                    2018-01-08 Mon        2018-01-05 Fri
                    2018-01-06 Tues       2018-01-08 Mon

1 个答案:

答案 0 :(得分:4)

首先,引用Airflow docs

  

请注意,如果您在一天的schedule_interval上运行DAG,则会在2016-01-01T23:59之后不久触发标记为2016-01-01的运行。换句话说,作业实例一旦它所涵盖的时间段结束就会启动。

     

让我们重复一遍调度程序在开始日期之后,在期间结束时运行您的作业一个schedule_interval。

那么这里发生了什么?

  1. Cron指定期间
  2. 指定0 2 * * MON-FRI表示您的期间为:

    MON 2AM -> TUE 2AM
    TUE 2AM -> WED 2AM
    WED 2AM -> THU 2AM
    THU 2AM -> FRI 2AM
    FRI 2AM -> MON 2AM <- the problem
    
    1. Airflow将执行日期设置为期间的开头,并等待其结束。
    2. 这意味着您所需的执行日期定义了期间的结束,但您想要的数据分区是在期间的开头。

      长话短说:不可能指定一周的定期划分,以便每个时段从工作日开始,到第二天结束。为什么?因为没有时间可以代表周末发生的事情。

      如何使定期分工合作?

      • 只需在凌晨2点将其设置为每日,并在DAG的开头添加条件任务,如果执行日期是周末,则跳过执行。
      • 使用0 2 * * TUE-SAT,但不相信execution_date表示您的下一个待处理数据何时开始完全,但是当您的过去数据被视为已处理时。< / LI>