如何在 Airflow 中管理 Python 依赖项?

Sru*_*ule 7 airflow google-cloud-composer

在我的本地机器上,我创建了一个 virtualenv 并安装了 Airflow。当 dag 或插件需要 python 库时,我将它安装到同一个 virtualenv 中。

如何跟踪哪些库属于 dag,哪些库用于气流本身?我最近删除了一个 dag 并想删除它正在使用的库。这非常耗时,我交叉手指我没有删除另一个 dag 正在使用的东西!

Olu*_*ule 7

airflow.operators.python_operator.PythonVirtualenvOperator您可能会看到有关Dag在使用 的地方使用 in 的内容PythonOperator

使用VirtualenvOperatorin 代替隔离 a到 aPythonOperator的依赖关系,并且您可以保留单独的需求文件。DagVirtualenv

您可以在需求文件中使用注释来标记例如的依赖Dag 关系

package-one # Dag1.
Run Code Online (Sandbox Code Playgroud)

...当您删除Dag带有 DAG 名称的 , grep 要求时,卸载然后删除这些行。

通过这种方式,当您安装 DAG 的包时,您需要一个过程来注释Dag需求文件中的名称。您可以编写一个脚本来执行此操作。

  • 如果您有一个包含大量软件包的大项目,则不切实际。Virtualenv 是为您调用的每个 VirtualenvOperator 创建和销毁的。 (3认同)

chr*_*non 6

特别是对于较大的 Airflow 用例,我建议使用 Airflow 作为在不同抽象层上编排任务的一种方式,这样您就不会从 Airflow 端管理依赖项。

我建议您查看 DockerOperator 或 KubernetesPodOperator。有了这些,您可以将 Python 任务构建到 Docker 容器中,并让 Airflow 运行这些任务。这样你就不需要在 Airflow 中管理 Python 依赖,也不会遇到两个 DAG 依赖冲突的灾难场景。但是,这确实需要您了解管理 Kubernetes 集群。

  • @alex您不一定需要将所有三个任务打包到一个 docker 调用中。您可以将它们分成三张图像,或者将一张图像用于三个不同的调用。我同意,让三个 Airflow 任务运行三个阶段是更好的做法。 (2认同)
  • DockerOperator 与 KubernetesPodOperator 实际上取决于您的底层基础设施。简而言之,DockerOperator 将在 Airflow Worker 所在的节点上运行 Docker 镜像。如果该节点的资源利用率完全被消耗,您的 docker 容器将无法运行。Kubernetes 集群是一种管理节点集群来运行 docker 容器的方法。因此 KubernetesPodOperator 将有一个完整的集群可用于运行您的 docker 容器。如果您使用大量机器资源,我建议使用 KubernetesPodOperator。 (2认同)