【问题标题】:Airflow: how to schedule a dag to start the day following a weekday?气流:如何安排一天从工作日的第二天开始?
【发布时间】:2018-09-20 09:18:34
【问题描述】:

如何安排 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

【问题讨论】:

    标签: python airflow airflow-scheduler


    【解决方案1】:

    首先,引用Airflow docs

    请注意,如果您在一天的 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
    
    1. Airflow 将执行日期设置为周期的开始,并等待它的结束。

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

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

    你怎样才能使一个有效的期刊划分?

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

    【讨论】:

    • “只需将其设置为每天凌晨 2 点,并在 DAG 的开头放置一个条件任务,如果执行日期是周末,则跳过执行。” ^ 这就是我要做的 - 只需使用接受“execution_date”作为参数的 PythonBranch 运算符并检查它是否是周末。如果是则结束运行,否则运行正常的日常任务。
    • 等等,如果您想在周一至周五凌晨 2:00 实际运行,您不希望 cron 为 0 2 * * 0-4 吗?这样,第一个间隔将是周日凌晨 2:00 -> 周一凌晨 1:59,使第一个任务在周一早上运行
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    相关资源
    最近更新 更多