气流:如何安排 dag 在工作日的第二天开始?

Roa*_*ord 4 python airflow airflow-scheduler

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

我的理由是,我会在每个工作日结束时获取数据,并希望在第二天早上进行处理。气流常见的陷阱将执行日期描述为数据所属的日期,而开始日期是您运行 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
Run Code Online (Sandbox Code Playgroud)

我设法做到的最接近的是使用时间表: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
Run Code Online (Sandbox Code Playgroud)

或时间表: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
Run Code Online (Sandbox Code Playgroud)

vil*_*asv 8

首先,引用Airflow 文档

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

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

那么这里发生了什么?

  1. Cron 指定时间段

指定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
Run Code Online (Sandbox Code Playgroud)
  1. Airflow 将执行日期设置为周期开始,并等待周期结束。

这意味着您想要的执行日期定义了周期的结束,但是您想要的数据分区在周期的开始之后。

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

你怎样才能做一个有效的期刊分工?

  • 只需将其设置为每天凌晨 2 点,并在 DAG 的开头放置一个条件任务,如果执行日期是周末,则跳过执行。
  • 使用0 2 * * TUE-SAT但不信任的execution_date代表时,你的下一个待处理的数据开始准确,但是当你的过去的数据被认为已被处理。