在Airflow任务之间共享大的中间状态

时间:2018-02-12 21:40:15

标签: airflow

我们使用Celery执行程序部署了Airflow。

我们的许多DAG都需要BashOperatorPythonOperator中某个文件的本地处理步骤。

但是,根据我们的理解,给定DAG的任务可能并不总是安排在同一台机器上。

到目前为止我收集的任务之间的状态共享选项:

  1. 使用Local Executors - 对于一个团队而言,这可能已足够,具体取决于负载,但可能无法扩展到更广泛的公司

  2. 使用XCom - 这是否有尺寸限制?可能不适合大文件

  3. 为每个需要本地处理的任务组合编写自定义运算符。这种方法减少了任务的模块化,需要复制现有的操作员代码。

  4. 使用Celery队列将DAG路由到同一个工作人员docs) - 这个选项最初看起来很有吸引力,但是在适当的方式设置它是什么为了避免将所有内容路由到一个执行程序,或者制作一百万个队列?

  5. 在运行执行程序的所有计算机中使用共享网络存储 - 看起来像是额外的基础设施负担,但是有可能。

  6. 在Airflow中的任务之间共享大型中间状态(如文件)的推荐方法是什么?

1 个答案:

答案 0 :(得分:2)

澄清一些事情:无论你如何设置气流,只会有一个执行器正在运行。

  • 执行程序在与调度程序相同的计算机上运行。
  • 目前(当前是写入时的气流1.9.0)没有安全的方式来运行多个调度程序,因此只会有一个执行程序在运行。
  • 本地执行程序在与调度程序相同的计算机上执行任务。
  • Celery Executor只是将任务放入队列中,以便对芹菜工人进行处理。

但是,您提出的问题确实适用于芹菜工人。如果您使用Celery Executor,您可能会有多个芹菜工人。

使用网络共享存储解决了多个问题:

  • 每个工作机器看到相同的dag,因为它们具有相同的dags文件夹
  • 运营商的结果可以存储在共享文件系统上
  • 调度程序和网络服务器也可以共享dags文件夹并在不同的计算机上运行

我会使用网络存储,并将输出文件名写入xcom。然后,当您需要输入上一个任务的输出时,您将从该任务的Xcom中读取文件名并处理该文件。