【问题标题】:Airflow backfill breaks catchup=True气流回填中断追赶=真
【发布时间】:2019-06-22 15:13:48
【问题描述】:

我想知道airflow backfill 究竟是如何工作的,因为它有助于解释我在使用 Airflow 时遇到的一些问题。它只是启动某种不考虑其余 DAG 并覆盖 start_date 和 end_date 的调度程序进程吗?还是不止这些?

我的用例:有时我想为一个 DAG 重新运行一周,通常是在我向它添加一些新功能时。为此,我使用 CLI (airflow clear) 清除所需日期的任务实例。但有时,我可能会改变主意,认为这周不是重播的合适时间。所以我暂停 DAG,并使用命令airflow backfill -m 将清除的任务实例设置为成功。

当我这样做时,相关的任务实例会进入关于 catchup=True 行为的“损坏”状态。如果我再次清除它们,它们将永远不会被安排,尽管它们的 DAG 运行处于“运行”状态(它们保持无状态)。我进行了几次测试,我 90% 确定 airflow backfill 是罪魁祸首。

毕竟,我不应该在具有 catchup=True 的 DAG 上使用 airflow backfill 似乎是合乎逻辑的,但这是我为大量任务实例标记成功的唯一方法。有人知道此命令是否会修改 DAG 运行的状态,将其设置为运行?不知何故,我感觉它取代了它的追赶设置。

【问题讨论】:

    标签: airflow


    【解决方案1】:

    好吧,我想我明白了。

    TL;DR >> 调度程序不会运行 DAG 以 backfill_ 为前缀的任务实例

    backfill 命令启动BackfillJob,它将为指定日期创建 DAG 运行。就我而言,它实际上更新了这些日期的现有 DAG 运行。执行此操作时,它会更新这些 DAG 运行的 run_id,将 scheduled__ 前缀替换为 backfill_ 前缀。

    现在,如果我再次清除 DAG 运行,任务实例将变为无状态,并且我的 DAG 运行将开始运行。但是在检查是否应该运行任务实例时,调度程序不会考虑它们,尽管 DAG 运行处于运行状态,因为此 DAG 运行在其 ID 中有 backfill_ 前缀。这就是if run.is_backfillSchedulerJob_process_task_instances 方法中所做的事情

    可能会很高兴在 UI 中对此进行注释,而不是通常的“此任务实例已满足所有依赖项并应尽快运行”消息:)

    【讨论】:

    • 我有一个问题。假设我想为 start_date 之后的日期运行回填作业,但该日期没有后续的 scheduledmanual 运行。回填是否成功运行?(当前失败,覆盖失败的预定/手动运行,前缀为backfill_,没有日志!!)。我需要了解什么才能成功运行回填(即使是单个日期:catchup 设置为 False)??
    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2017-02-14
    • 2012-03-05
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多