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