气流回填破坏量追赶=正确

时间:2019-06-22 15:13:48

标签: airflow

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

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

执行此操作时,有关的任务实例在catchup=True行为方面处于“中断”状态。如果我再次清除它们,则尽管它们的DAG运行处于“运行”状态(它们保持“无”状态),但它们从未被调度。我已经进行了几次测试,而且90%的人确信airflow backfill是元凶。

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

1 个答案:

答案 0 :(得分:0)

好吧,我想我明白了。

TL; DR >>调度程序不会运行其DAG运行带有前缀backfill_

的任务实例

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

现在,如果我再次清除DAG运行,则任务实例将变为None状态,而我的DAG运行将运行。但是,在检查是否应运行任务实例时,尽管DAG运行处于运行状态,但调度程序不会考虑它们,因为此DAG运行的ID中带有backfill_前缀。这就是if run.is_backfillSchedulerJob

_process_task_instances方法中所做的

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