【问题标题】:How to manage Python dependencies in Airflow?如何在 Airflow 中管理 Python 依赖项?
【发布时间】:2019-07-04 15:33:03
【问题描述】:

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

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

【问题讨论】:

标签: airflow google-cloud-composer


【解决方案1】:

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

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

【讨论】:

  • 我看到了这个问题。现在假设您将 ETL 管道打包在 docker 容器中。如果这是一个 3 步过程并且其中一个失败了,Airflow 将不得不重新运行整个过程,而不仅仅是失败的那个正确吗?或者在您的 dockererized 任务中,您可以调用管道的单独部分吗?
  • @alex 您不一定需要将所有三个任务打包到一个 docker 调用中。您可以将它们分成三个图像,或者使用一个图像进行三个不同的调用。我同意,让三个 Airflow 任务运行三个阶段是更好的做法。
  • 同意这似乎是一种更好的做法。关于本主题的主题 - 您能否进一步说明为什么人们可能会使用 KubernetesPodOperator 而不是 DockerOperator?它们似乎都是将您的工作流程容器化的好方法。
  • DockerOperator vs KubernetesPodOperator 真的取决于你的底层基础设施。简而言之,DockerOperator 将在 Airflow 工作者所在的节点上运行一个 docker 镜像。如果该节点的资源利用率被完全消耗,您的 docker 容器将无法运行。 Kubernetes 集群是一种管理节点集群以运行 docker 容器的方法。所以 KubernetesPodOperator 将拥有一个完整的集群来运行你的 docker 容器。如果你使用大量机器资源,我推荐 KubernetesPodOperator。
  • 我第二个@chris.mclennon。我有一个相关的详细视频,可以帮助清晰的概念; youtube.com/watch?v=9pykChPp-X4
【解决方案2】:

Dags 中使用PythonOperator 时可能会看到airflow.operators.python_operator.PythonVirtualenvOperator

使用VirtualenvOperator 代替PythonOperatorDag 的依赖关系隔离到Virtualenv,您可以保留单独的需求文件。

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

package-one # Dag1.

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

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

【讨论】:

  • 如果您有一个包含大量软件包的大项目,则不实用。 Virtualenv 会为您调用的每个 VirtualenvOperator 创建和销毁。
  • 另外,这些要求不会污染 Airflow 环境吗?
  • @BrylieChristopherOxley 要求安装到虚拟环境中的临时文件夹中,以免污染 Airflow 环境。你可以阅读implementation here
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 2012-02-19
  • 2022-12-05
  • 2016-03-03
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多