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

Airflow 在任务之间共享大型中间状态,airflow,Airflow,我们有一个芹菜执行器气流部署 我们的许多DAG需要对bash操作符或PythonOperator中的某些文件进行本地处理 然而,根据我们的理解,给定DAG的任务可能并不总是安排在同一台机器上 到目前为止,我收集的任务之间的状态共享选项包括: 使用本地执行者-这可能满足一个团队的需要,具体取决于负载,但可能无法扩展到更广泛的公司 使用XCom-这有大小限制吗?可能不适合大文件 为其间需要本地处理的每个任务组合编写自定义运算符。这种方法减少了任务的模块化,并需要复制现有操作员的代码 使用芹菜队列将D

我们有一个芹菜执行器气流部署

我们的许多DAG需要对
bash操作符
PythonOperator
中的某些文件进行本地处理

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

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

  • 使用
    本地执行者
    -这可能满足一个团队的需要,具体取决于负载,但可能无法扩展到更广泛的公司

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

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

  • 使用芹菜队列将DAG路由到同一个工作人员()-此选项起初似乎很吸引人,但如何设置它以避免将所有内容路由到一个执行者,或创建一百万个队列

  • 在所有运行Executor的机器中使用共享网络存储——这似乎是额外的基础架构负担,但也有可能


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

    澄清一点:无论如何设置Airflow,都将只有一个执行器在运行

    • 执行器与调度程序在同一台计算机上运行
    • 目前(撰写本文时的当前版本为1.9.0),没有安全的方法运行多个调度程序,因此将只运行一个执行器
    • 本地执行器在与调度程序相同的计算机上执行任务
    • 芹菜执行器只是将任务放入队列中,以便芹菜工人处理
    然而,你问的问题确实适用于芹菜工人。如果你使用芹菜执行器,你可能会有多个芹菜工人

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

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

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

    如果您需要共享一个大的数据集,那么可以考虑像S3这样的数据湖。代码>气流不是数据流解决方案。任务不会将数据从一个移动到另一个(尽管任务可以交换元数据!)基于文档:如果您必须执行存储在s3中的python脚本,您将如何实现这一点?如果我有两个任务,其中一个任务将脚本下载到本地,下一个任务将执行脚本,它可能会失败,并出现“找不到文件”错误,因为下载的任务和执行任务可能在不同的机器上运行,对吗?