气流:为每个文件运行DAG的正确方法

时间:2020-02-05 19:06:23

标签: python etl airflow batch-processing directed-acyclic-graphs

我有以下任务要解决:

文件不定期地通过端点发送并存储在本地。我需要为每个文件触发DAG运行。对于每个文件,将执行相同的任务

总体流程如下:对于每个文件,运行任务A-> B-> C-> D

文件正在批量处理。尽管这项任务对我来说似乎微不足道,但我发现了几种方法可以做到这一点,但我对哪个是“适当的”(如果有)感到困惑。

第一种模式:使用实验性REST API触发dag。

也就是说,通过传递file_id作为conf,公开一个Web服务,该服务提取请求和文件,将其存储到文件夹,并使用experimental REST api来触发DAG。

缺点:REST api仍然是实验性的,不确定Airflow如何处理负载测试,同时很多请求同时出现(这不应该发生,但是,如果可以的话怎么办?)

第二种模式:2天。一个人使用TriggerDagOperator进行感应和触发,一个过程。

始终使用与前面所述相同的ws,但是这次仅存储文件。然后我们有:

  • 第一个dag:在给定N个文件的情况下,使用FileSensor和TriggerDagOperator来触发N个dags
  • 第二个任务:任务A-> B-> C

缺点:需要避免将相同的文件发送到两个不同的DAG运行中。 示例:

x.json文件夹中的文件 传感器找到x,触发DAG(1)

传感器返回并重新安排。如果DAG(1)没有处理/移动文件,则传感器DAG可能会重新计划使用相同文件运行的新DAG。哪个是不需要的。

第三种模式:对于文件中的文件,任务A-> B-> C

this question所示。

缺点:这可能有效,但是我不喜欢的是UI可能会混乱,因为每次DAG运行看起来都不一样,但是会随着正在处理的文件数而变化。另外,如果要处理1000个文件,则运行可能很难读取

第四种模式:使用子标记

我还不确定它们如何完全发挥作用,就像我所见的they are not encouraged(最后)一样,但是应该可以为每个文件生成一个subdag并使其运行。类似于this question

缺点:似乎subdags只能与顺序执行器一起使用。


我是否遗漏了一些东西而对我本应直截了当的想法进行了过度思考?谢谢

3 个答案:

答案 0 :(得分:2)

我知道我要迟到了,但是我会选择第二种模式:“ 2天。一个人使用TriggerDagOperator进行感应和触发,一个过程”,因为:

  • 每个文件都可以并行执行
  • 第一个DAG可以选择要处理的文件,对其进行重命名(添加后缀'_processing'或将其移至处理文件夹)
  • 如果我是贵公司的新开发人员,并且打开了工作流程,我想了解工作流程的逻辑是什么,而不是最后一次动态生成的文件是
  • 如果dag 2发现文件有问题,则将其重命名(带有'_error'后缀或将其移至错误文件夹)
  • 这是处理文件而不创建任何其他运算符的标准方法
  • 它使de DAG成为幂等且更易于测试。 article
  • 中的更多信息

重命名和/或移动文件是在每个ETL中处理文件的非常标准的方法。

顺便说一句,我总是推荐这篇文章https://medium.com/bluecore-engineering/were-all-using-airflow-wrong-and-how-to-fix-it-a56f14cb0753。不是

答案 1 :(得分:1)

似乎您应该能够使用bash运算符运行批处理程序dag来清除文件夹,只需确保在dag上设置depends_on_past=True即可确保在下次下次成功清除文件夹之前dag已排定。

答案 2 :(得分:0)

我找到了这篇文章:https://medium.com/@igorlubimov/dynamic-scheduling-in-airflow-52979b3e6b13

使用新的运算符,即TriggerMultiDagRunOperator。我认为这符合我的需求。