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

rol*_*gin 8 airflow

我们与Celery执行者一起进行了Airflow部署。

我们的许多DAG都需要对BashOperator或中的某些文件进行本地处理PythonOperator

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

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

  1. 用途Local Executors -这可能适合一个团队,具体取决于工作量,但可能无法扩展到更广泛的公司

  2. 使用XCom -这有大小限制吗?可能不适合大文件

  3. 为需要在两者之间进行本地处理的任务的每种组合编写自定义运算符。这种方法降低了任务的模块化,并需要复制现有的操作员代码。

  4. 使用Celery队列将DAG路由到同一工作人员docs)-起初该选项似乎很吸引人,但是为了避免将所有路由都路由到一个执行者或制作100万个队列,什么合适的设置方式?

  5. 在运行执行程序的所有计算机上使用共享的网络存储 -似乎增加了基础架构负担,但有可能。

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

jhn*_*lvr 6

澄清一下:无论您如何设置气流,都只会运行一个执行器。

  • 执行程序与调度程序在同一台计算机上运行。
  • 当前(在撰写本文时,当前的流量为1.9.0)没有安全的方法来运行多个调度程序,因此将永远只有一个执行程序在运行。
  • 本地执行程序在与调度程序相同的计算机上执行任务。
  • Celery Executor只是将要排队的任务放在芹菜工人身上。

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

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

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

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