Amazon MWAA 管理 Python 依赖性的最佳实践 大数据博客
  • 6

Amazon MWAA 管理 Python 依赖的最佳实践

关键要点

在 Amazon MWAA 环境中, Python 依赖项管理是确保数据管道和机器学习工作负载正常运行的关键。为确保一致性,建议在 requirementstxt 文件中准确指定包名称和版本。使用约束文件constraints file可以防止包冲突,确保兼容性。创建 zip 文件打包依赖并与 MWAA 配置相结合,可以确保环境一致性。

客户使用 Amazon 管理的 Apache Airflow 工作流Amazon MWAA 作为中心平台,运行数据管道和机器学习ML工作负载。为了支持这些管道,他们通常需要额外的 Python 包,例如 Apache Airflow Providers。比如,一个管道可能需要用于与 Snowflake 数据仓库交互的 Snowflake 提供者包,或者用于开发 Kubernetes 工作负载的 Kubernetes 提供者包。因此,他们需要有效且可靠地管理这些 Python 依赖,以确保彼此之间以及与基本的 Apache Airflow 安装兼容。

Python 配备了工具 pip,可以处理包安装。要安装包,需要在名为 requirementstxt 的特殊文件中添加包名称。pip install 命令会指示 pip 读取需求文件的内容,确定依赖项并安装包。Amazon MWAA 在初始环境启动和后续更新时使用该 requirementstxt 文件运行 pip install 命令。有关详细信息,请参见 它是如何工作的。

创建一个可重现且稳定的需求文件 是减少 pip 安装和 DAG 错误的关键。此外,这一套定义的需求可以确保在 Amazon MWAA 环境中的节点之间的一致性。这在 工作者自动缩放 时尤其重要,此时会配置额外的工作节点,不同的依赖可能会导致不一致和任务失败。此外,这种策略还可以在不同的 Amazon MWAA 环境如开发、测试和生产之间促进一致性。

本文将描述在 Amazon MWAA 环境中管理需求文件的最佳实践,定义确定所需包和包版本、创建和验证带有版本的 requirementstxt 文件以及打包依赖项所需的步骤。

最佳实践

以下部分描述了管理 Python 依赖的最佳实践。

在 requirementstxt 文件中指定包版本

在创建 Python requirementstxt 文件时,可以仅指定包名,也可以指定包名和特定版本。如果没有版本信息地添加包,则将指示 pip 安装程序下载并安装最新可用版本,前提是与其他已安装包及其任何约束兼容。在环境创建期间选择的包版本可能与稍后自动缩放事件中选择的版本不同。这种版本变化可能会导致包冲突,从而导致 pip 安装错误。即使更新的包成功安装,包中的代码变更也可能影响任务行为,导致输出不一致。为了避免这些风险,最好的做法是在 requirementstxt 文件中的每个包后添加版本号。

为你的 Apache Airflow 版本使用约束文件

约束文件包含与您的 Apache Airflow 版本兼容的包及其版本。该文件为防止包冲突添加了额外的验证层。由于约束文件在防止冲突方面起着重要作用,从 Apache Airflow v272 开始,您的需求文件必须包括 constraint 语句。如果未提供 constraint 语句,Amazon MWAA 将为您指定 兼容的约束文件。

每个 Airflow 版本和 Python 版本组合都有约束文件可用。其 URL 格式如下:

https//rawgithubusercontentcom/apache/airflow/constraints{AIRFLOWVERSION}/constraints{PYTHONVERSION}txt

官方 Apache Airflow 约束是指导方针,如果您的工作流需要更高版本的提供者包,则可能需要 修改约束文件并将其包含在 DAG 目录中。在这样做时,本文中概述的最佳实践变得更加重要,以防止包冲突。

创建所有依赖项的 zip 压缩文件

创建一个包含您需求文件中包的 zip 文件,将其指定为包存储源,确保在初始环境设置和后续节点配置期间使用完全相同的 wheel 文件。 pip 安装程序将使用这些本地文件进行安装,而不是连接到外部的 PyPI 存储库。

测试 requirementstxt 文件和依赖 zip 文件

在生产发布前测试需求文件是避免安装和 DAG 错误的关键。建议在本地使用 MWAA 本地运行器 和在开发或暂存的 Amazon MWAA 环境中进行测试,然后再部署到生产环境。您可以使用持续集成 (CI/CD) 部署策略来执行需求和包安装测试,具体步骤请参见 使用 Amazon 管理的 Apache Airflow 自动化 DAG 部署。

解决方案概述

这个解决方案使用 MWAA 本地运行器,这是一个开源工具,能够在本地复制 Amazon MWAA 环境。您将使用本地运行器来构建和验证您的需求文件,并打包依赖项。在本示例中,您将安装 snowflake 和 dbtcloud 提供者包。然后,您使用 MWAA 本地运行器和约束文件确定与 Apache Airflow 兼容的每个包的确切版本。通过这些信息,您更新需求文件,将每个包固定到一个版本,并重新测试安装。当您成功安装后,您将打包依赖项并在非生产的 Amazon MWAA 环境中进行测试。

我们使用 MWAA 本地运行器 v281 进行这次操作,以下是步骤:

下载并构建 MWAA 本地运行器。创建并测试带有包版本的需求文件。打包依赖项。将需求文件和依赖项部署到非生产的 Amazon MWAA 环境中。

前提条件

进行此操作之前,您应具备以下前提条件:

一个在 Amazon MWAA 支持的 AWS 区域 的 AWS 账户。访问 Amazon MWAA 和 Amazon 简单存储服务Amazon S3的权限。Docker Desktop。

设置 MWAA 本地运行器

首先,您需要下载与目标 MWAA 环境相匹配的 MWAA 本地运行器 版本,然后构建镜像。

完成以下步骤以配置本地运行器:

使用以下命令克隆 MWAA 本地运行器的代码库:

bash git clone git@githubcomaws/awsmwaalocalrunnergit b v281

确保 Docker 正在运行,然后使用以下命令构建容器:

bash cd awsmwaalocalrunner /mwaalocalenv buildimage

创建并测试带有包版本的需求文件

构建一个带版本的需求文件能够确保所有 Amazon MWAA 组件安装相同的包版本。要确定每个包的兼容版本,需要从约束文件和不带版本的需求文件开始,让 pip 解决依赖。然后根据 pip 的安装输出创建版本化的需求文件。

以下图示说明了这一工作流程。

要构建初始需求文件,完成以下步骤:

在 MWAA 本地运行器目录中,打开 requirements/requirementstxt 文件。

默认需求文件会类似于以下内容:

plaintextconstraint https//rawgithubusercontentcom/apache/airflow/constraints281/constraints311txtapacheairflowproviderssnowflake==521apacheairflowprovidersmysql==551

将现有包替换为以下包列表:

plaintextconstraint https//rawgithubusercontentcom/apache/airflow/constraints281/constraints311txtapacheairflowproviderssnowflakeapacheairflowprovidersdbtcloud[http]

保存 requirementstxt。在终端中运行以下命令生成 pip install 输出:

bash/mwaalocalenv testrequirements

testrequirements 会运行 pip install,其处理兼容包版本的解析。使用约束文件可确保所选包与您的 Airflow 版本兼容。输出将类似于以下内容:

plaintextSuccessfully installed apacheairflowprovidersdbtcloud351 apacheairflowproviderssnowflake521 pyOpenSSL2330 snowflakeconnectorpython360 snowflakesqlalchemy151 sortedcontainers240

以 Successfully installed 开头的消息是我们关注的输出。这显示了 pip 安装了哪些依赖及其具体版本。您可以使用此列表创建最终的版本化需求文件。

河马加速器免费一小时

您的输出还将包含对基于 Amazon MWAA 环境中已存在的包的 Requirement already satisfied 消息。您无需将这些包添加到 requirementstxt 文件中。

根据 testrequirements 命令的版本化包的列表更新需求文件。更新后的文件将类似于以下代码:

plaintextconstraint https//rawgithubusercontentcom/apache/airflow/constraints281/constraints311txtapacheairflowproviderssnowflake==521apacheairflowprovidersdbtcloud[http]==351pyOpenSSL==2330snowflakeconnectorpython==360snowflakesqlalchemy==151sortedcontainers==240

接下来,您需要测试更新后的需求文件,以确认没有冲突。

重新运行 requirementstest 函数:

bash/mwaalocalenv testrequirements

成功的测试不会产生任何错误。如果遇到依赖冲突,请返回上一步并根据 pip 的输出更新需求文件,以添加其他包或包版本。

打包依赖项

如果您的 Amazon MWAA 环境有一个私有 Web 服务器,则必须将依赖项打包成一个 zip 文件,上传该文件到您的 S3 桶中,并在 Amazon MWAA 实例配置中指定包位置。由于私有 Web 服务器无法通过互联网访问 PyPI 存储库,因此 pip 将从 zip 文件中安装依赖项。

如果您使用的是公共 Web 服务器配置,您同样会受益于一个静态的 zip 文件,它确保包信息在被显式重建之前保持不变。

该过程使用上一个部分中创建的版本化需求文件和 MWAA 本地运行器中的 packagerequirements 功能。

要打包您的依赖项,请完成以下步骤:

在终端中,导航到安装本地运行器的目录。下载适用于您的 Python 版本和 Apache Airflow 版本的约束文件,并将其放置在 plugins 目录中。对于本篇文章,我们使用 Python 311 和 Apache Airflow v281:

bashcurl o plugins/constraints281311txt https//rawgithubusercontentcom/apache/airflow/constraints281/constraints311txt

在需求文件中,将约束 URL 更新为本地下载的文件。

constraint 语句指示 pip 比较 requirementstxt 文件中的包版本与约束文件中的允许版本。将特定的约束文件下载到 plugins 目录,使您能够控制约束文件的位置和内容。

更新后的需求文件将如下所示:

plaintextconstraint /usr/local/airflow/plugins/constraints281311txtapacheairflowproviderssnowflake==521apacheairflowprovidersdbtcloud[http]==351pyOpenSSL==2330snowflakeconnectorpython==360snowflakesqlalchemy==151sortedcontainers==240

Amazon MWAA 管理 Python 依赖性的最佳实践 大数据博客运行以下命令以创建 zip 文件:

bash/mwaalocalenv packagerequirements

packagerequirements 会创建一个名为 packagedrequirementstxt 的更新需求文件并将所有依赖项压缩到 pluginszip 中。更新后的需求文件如下所示:

plaintextfindlinks /usr/local/airflow/pluginsnoindexconstraint /usr/local/airflow/plugins/constraints281311txtapacheairflowproviderssnowflake==521apacheairflowprovidersdbtcloud[http]==351pyOpenSSL==2330snowflakeconnectorpython==360snowflakesqlalchemy==151sortedcontainers==240

请注意对本地约束文件和插件目录的引用。findlinks 语句指示 pip 从 /usr/local/airflow/plugins 而非公共 PyPI 存储库安装包。

部署需求文件

在您实现无错误的需求安装并打包依赖项后,您可以准备将这些资源部署到非生产的 Amazon MWAA 环境中。即使是在使用 MWAA 本地运行器验证和测试需求时,最好在非生产的 Amazon MWAA 环境中部署和测试更改,然后再部署到生产。有关使用 CI/CD 管道测试更改的更多信息,请参阅 部署到 Amazon 管理的 Apache Airflow。

要部署更改,请完成以下步骤:

将 requirementstxt 文件和 pluginszip 文件上传到您的 Amazon MWAA 环境的 S3 桶中。

有关指定 requirementstxt 版本的说明,请参见 在 Amazon MWAA 控制台上指定 requirementstxt 版本。有关指定 pluginszip 文件的说明,请参见 在您的环境中安装自定义插件。

Amazon MWAA 环境将更新并安装 pluginszip 文件中的包。

在更新完成后,通过 Apache Airflow UI 验证提供者包的安装情况。

访问 Amazon MWAA 中的 Apache Airflow UI。在 Apache Airflow 菜单栏上,选择 Admin ,然后选择 Providers。

提供者及其版本的列表将显示在表中。在此示例中,页面反映了 apacheairflowprovidersdbtcloud 版本 351 和 apacheairflowproviderssnowflake 版本 521 的安装。此列表仅包含已安装的提供者包,而不包含所有辅助 Python 包。作为基本 Apache Airflow 安装一部分的提供者包也会出现在列表中。下图显示了包列表的示例;注意 apacheairflowprovidersdbtcloud 和 apacheairflowproviderssnowflake 包及其版本。

若要验证所有包的安装,请查看 Amazon CloudWatch Logs 中的结果。当需求安装成功时,会创建一个日志流,该流包含 pip 安装输出。有关说明,请参阅 查看您的 requirementstxt 日志。

成功的安装结果将包含如下消息:

plaintextSuccessfully installed apacheairflowprovidersdbtcloud351 apacheairflowproviderssnowflake521 pyOpenSSL2330 snowflakeconnectorpython360 snowflakesqlalchemy151 sortedcontainers24