如何指示气流从最新到最旧的回填

时间:2018-07-18 11:39:20

标签: airflow airflow-scheduler

我有一个Airflow DAG,计划每天运行。当我开始上个月的回填时,Airflow将开始处理从最早到最新的运行。由于单次运行需要几个小时,这意味着当新的运行可用时(经过回填的一天已经过去了),只有在整个回填完成后才处理新的运行(导致最近的数据被保留)。不适用于该公司)。是否可以指示Airflow处理从最新到最早的运行?

5 个答案:

答案 0 :(得分:1)

我认为Airflow标准组件无法做到这一点。

根据任务的数量,您可以将所有任务设置为成功状态。运行完成后,只需清除状态即可完成导入的整个过程。

答案 1 :(得分:0)

气流将确定该DAG运行的最新日期,以安排该DAG运行的日期。

一个解决方案(尽管是一个混乱的解决方案)是创建一个今天手动运行的DAG(确保您完全匹配Dag Id,并使用调度程序使用的一致Run Id格式)。这将迫使Airflow跳过应该在新的DAG运行执行日期之前发生的DAG运行。

然后,您可以复制DAG本身,对其进行重命名,并设置开始日期和结束日期。开始日期应该是回填开始的时间,结束日期应该是您为手动DAG运行设置的执行日期之前的日期/时间。 (还可以再等一秒钟)

这将使您的主要DAG保持最新状态,同时回填数据。但是,这样做会将您的DAG历史记录保留在两个地方。如果您真的很在乎,则可以编写一些SQL进行合并。根据您DAG的设置方式,它可能不适用于所有用例,但可以为您提供解决方案。

答案 2 :(得分:0)

您的问题的简短答案是“否”,这是今天不支持的Airflow功能。在DAG被大量积压之后,我们中的一些人在类似情况下也有类似的愿望,因此可能值得在Airflow Jira上为其添加票证或在Airflow mailing list上启动线程以收集更多的投入。 (毕竟,也许这是一个足够普遍的情况,我们应该考虑正式支持它。)

与此同时,您可以采取的一种措施是创建所有回填,并根据您的回填数量手动/编程将其标记为失败。然后,重新运行失败的DAG,从最新的开始运行,而不是正常的最早的运行。这不像内置功能那么简单,但是在类似情况下,我将其用作解决方法。

触发“自动失败的DAG运行”的一种方法是添加一行引发异常的行,作为DAG中第一个任务的第一行,然后在创建所有回填DAG运行后删除该行。 / p>

答案 3 :(得分:0)

有一个feature request标记为已解决。

从票证详细信息来看,Airflow 1.10.3似乎将提供该服务。在撰写本文时,它具有yet to be released,但很快就会出现。

用法在票务注释中指示:

  

通过在计划程序部分下设置backfill_dagrun_order_reverse = True来反向创建回填dagrun

答案 4 :(得分:0)

您可以在Airflow 1.10.3中实现

https://airflow.apache.org/cli.html#backfill

airflow backfill --run_backwards dag_id