首页 文章

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

提问于
浏览
2

我们与Celery执行程序部署了Airflow .

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

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

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

  • Use Local Executors - 对于一支球队来说这可能就足够了,具体取决于负荷,但可能无法扩展到更广泛的公司

  • Use XCom - 这是否有尺寸限制?可能不适合大文件

  • Write custom Operators 用于需要在其间进行本地处理的每个任务组合 . 这种方法减少了任务的模块化,需要复制现有的运营商代码 .

  • Use Celery queues to route DAGs to the same workerdocs) - 这个选项起初看起来很有吸引力,但是为了避免将所有内容都路由到一个 Actuator 或者制作一百万个队列,设置它的方法是什么?

在运行执行程序的所有计算机中

  • Use a shared network storage - 看起来像是额外的基础架构负担,但是有可能 .

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

1 回答

  • 1

    澄清一下:无论你如何设置气流,只会有一个 Actuator 在运行 .

    • 执行程序与调度程序在同一台机器上运行 .

    • 目前(当前是写入时的气流1.9.0)没有安全的方法来运行多个调度程序,因此只会有一个执行程序在运行 .

    • 本地执行程序在与调度程序相同的计算机上执行任务 .

    • Celery Executor只是将任务放入队列中,以便对芹菜 Worker 进行处理 .

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

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

    • 每个工作者机器看到相同的dags,因为它们具有相同的dags文件夹

    • 运算符的结果可以存储在共享文件系统中

    • 调度程序和Web服务器还可以共享dags文件夹并在不同的计算机上运行

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

相关问题