我有以下任务要解决:
文件不定期地通过端点发送并存储在本地。我需要为每个文件触发DAG运行。对于每个文件,将执行相同的任务
总体流程如下:对于每个文件,运行任务A-> B-> C-> D
文件正在批量处理。尽管这项任务对我来说似乎微不足道,但我发现了几种方法可以做到这一点,但我对哪个是“适当的”(如果有)感到困惑。
也就是说,通过传递file_id作为conf,公开一个Web服务,该服务提取请求和文件,将其存储到文件夹,并使用experimental REST api来触发DAG。
缺点:REST api仍然是实验性的,不确定Airflow如何处理负载测试,同时很多请求同时出现(这不应该发生,但是,如果可以的话怎么办?)
始终使用与前面所述相同的ws,但是这次仅存储文件。然后我们有:
缺点:需要避免将相同的文件发送到两个不同的DAG运行中。 示例:
x.json文件夹中的文件 传感器找到x,触发DAG(1)
传感器返回并重新安排。如果DAG(1)没有处理/移动文件,则传感器DAG可能会重新计划使用相同文件运行的新DAG。哪个是不需要的。
如this question所示。
缺点:这可能有效,但是我不喜欢的是UI可能会混乱,因为每次DAG运行看起来都不一样,但是会随着正在处理的文件数而变化。另外,如果要处理1000个文件,则运行可能很难读取
我还不确定它们如何完全发挥作用,就像我所见的they are not encouraged(最后)一样,但是应该可以为每个文件生成一个subdag并使其运行。类似于this question。
缺点:似乎subdags只能与顺序执行器一起使用。
我是否遗漏了一些东西而对我本应直截了当的想法进行了过度思考?谢谢
答案 0 :(得分:2)
我知道我要迟到了,但是我会选择第二种模式:“ 2天。一个人使用TriggerDagOperator进行感应和触发,一个过程”,因为:
重命名和/或移动文件是在每个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。我认为这符合我的需求。