我想知道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运行状态(从将其设置为运行状态)?我以某种方式感觉到它取代了其追赶设置。
答案 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_backfill
在SchedulerJob
_process_task_instances
方法中所做的
可能会很高兴在UI中对此进行注释,而不是通常的“此任务实例已满足所有依赖关系并应尽快运行”消息:)