安装 Python 依赖项 (original) (raw)

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本页介绍了如何为 Cloud Composer 环境安装 Python 软件包。

Cloud Composer 中的软件包简介

本部分介绍了 PyPI 软件包在 Cloud Composer 中的工作原理。

Cloud Composer 映像中的预安装和自定义 PyPI 软件包

Cloud Composer 映像包含预安装的 PyPI 软件包和自定义 PyPI 软件包。

用于管理 Cloud Composer 环境的 PyPI 软件包的选项

选项 使用条件
从 PyPI 安装 在环境中安装软件包的默认方式
从具有公共 IP 地址的代码库安装 软件包托管在 PyPI 以外的软件包代码库中。此代码库具有公共 IP 地址
从 Artifact Registry 制品库安装 该软件包托管在 Artifact Registry 制品库中
从项目网络中的代码库安装 您的环境没有公共互联网访问权限。该软件包托管在项目网络中的软件包仓库中。
作为本地 Python 库安装 在 PyPI 中找不到该软件包,并且该库没有任何外部依赖项,例如 dist-packages。
安装插件 该软件包提供插件特有的功能,例如修改 Airflow 网页界面。
PythonVirtualenvOperator 您不希望为所有 Airflow 工作器安装该软件包,或者该依赖项与预安装的软件包冲突。该软件包可以在 PyPI 中找到,并且没有外部依赖项。
KubernetesPodOperatorGKE Operator 您所需的外部依赖项无法通过 pip 安装(例如 dist-packages),或者这些外部依赖项位于内部 pip 服务器上。此选项需要进行更多设置和维护。仅当其他选项不起作用时,才考虑使用此方法。

准备工作

查看 PyPI 软件包列表

您可以通过多种格式获取环境的软件包列表。

查看预安装的软件包

如需查看您的环境的预安装软件包列表,请参阅您环境的 Cloud Composer 映像的软件包列表。

查看所有软件包

如需查看环境中的所有软件包(包括预安装的软件包和自定义软件包),请执行以下操作:

gcloud

以下 gcloud CLI 命令会针对您环境中的 Airflow 工作器返回 python -m pip list 命令的结果。您可以使用 --tree 参数来获取 python -m pipdeptree --warn 命令的结果。

gcloud beta composer environments list-packages \
    ENVIRONMENT_NAME \
    --location LOCATION

您需要进行如下替换:

查看自定义 PyPI 软件包

控制台

  1. 在 Google Cloud 控制台中,前往环境页面。
    转到“环境”
  2. 在环境列表中,点击您的环境名称。环境详情页面会打开。
  3. 前往 PyPI 软件包标签页。

gcloud

gcloud composer environments describe ENVIRONMENT_NAME \
  --location LOCATION \
  --format="value(config.softwareConfig.pypiPackages)"

替换:

在 Cloud Composer 环境中安装自定义软件包

本部分介绍了在环境中安装自定义软件包的不同方法。

从 PyPI 安装软件包

如果软件包没有外部依赖项或与预安装的软件包冲突,则可以从 Python Package Index 安装该软件包。

如需为您的环境添加、更新或删除 Python 依赖项,请按如下所述操作:

控制台

  1. 在 Google Cloud 控制台中,前往环境页面。
    转到“环境”
  2. 在环境列表中,点击您的环境名称。环境详情页面会打开。
  3. 前往 PyPI 软件包标签页。
  4. 点击修改
  5. 点击添加软件包
  6. PyPI 软件包部分,指定软件包名称以及可选的版本说明符和 extras。
    例如:
    • scikit-learn
    • scipy>=0.13.3
    • nltk[machine_learning]
  7. 点击保存

gcloud

gcloud CLI 提供了多个用于处理自定义 PyPI 软件包的参数:

通过文件安装要求

requirements.txt 文件中的每个要求说明符都必须单独列为一行。

例如:

scipy>=0.13.3
scikit-learn
nltk[machine_learning]

更新环境,并在 --update-pypi-packages-from-file 参数中指定 requirements.txt 文件。

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-packages-from-file requirements.txt

您需要进行如下替换:

安装一个软件包

更新您的环境,并在 --update-pypi-package 参数中指定软件包、版本和 extra。

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-package PACKAGE_NAMEEXTRAS_AND_VERSION

您需要进行如下替换:

示例:

gcloud composer environments update example-environment \
    --location us-central1 \
    --update-pypi-package "scipy>=0.13.3"

移除软件包

更新您的环境,并在 --remove-pypi-packages 参数中指定要删除的软件包:

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --remove-pypi-packages PACKAGE_NAMES

您需要进行如下替换:

示例:

gcloud composer environments update example-environment \
    --location us-central1 \
    --remove-pypi-packages scipy,scikit-learn

API

构建 environments.patch API 请求。

在此请求中:

  1. 在参数 updateMask 中,指定该掩码:
    • 使用 config.softwareConfig.pypiPackages 掩码将所有现有软件包替换为指定软件包。未指定的软件包会被删除。
    • 使用 config.softwareConfig.envVariables.PACKAGE_NAME 添加或更新特定软件包。如需添加或更新多个软件包,请使用英文逗号分隔多个掩码。
  2. 在请求正文中,为版本和 extra 指定软件包和值:
{  
  "config": {  
    "softwareConfig": {  
      "pypiPackages": {  
        "PACKAGE_NAME": "EXTRAS_AND_VERSION"  
      }  
    }  
  }  
}  

您需要进行如下替换:

示例:

// PATCH https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.softwareConfig.pypiPackages.EXAMPLE_PACKAGE,
// config.softwareConfig.pypiPackages.ANOTHER_PACKAGE
{
  "config": {
    "softwareConfig": {
      "pypiPackages": {
        "EXAMPLE_PACKAGE": "",
        "ANOTHER_PACKAGE": ">=1.10.3"
      }
    }
  }
}

Terraform

software_config 块中的 pypi_packages 块可用于指定软件包。

resource "google_composer_environment" "example" {
  name = "ENVIRONMENT_NAME"
  region = "LOCATION"

  config {

    software_config {

      pypi_packages = {
          PACKAGE_NAME = "EXTRAS_AND_VERSION"
      }

    }
  }
}

您需要进行如下替换:

示例:

resource "google_composer_environment" "example" {
  name = "example-environment"
  region = "us-central1"

  config {

    software_config {
      pypi_packages = {
          scipy = ">=1.10.3"
          scikit-learn = ""
          nltk = "[machine_learning]"
      }
    }
  }
}

从公共代码库安装软件包

您可以安装托管在具有公共 IP 地址的其他代码库中的软件包。

软件包必须正确配置,以便默认 pip 工具可以安装。

如需从具有公共地址的软件包代码库进行安装,请执行以下操作:

  1. 创建一个 pip.conf 文件,如果适用,在文件中包含以下信息:
    • 代码库的网址(在 index-url 参数中)
    • 代码库的访问凭据
    • 非默认 pip 安装选项
      示例:
[global]  
index-url=https://example.com/  
  1. (可选)在某些情况下,您可能需要从多个代码库提取软件包,例如,当公共代码库包含您要安装的某些特定软件包,而您又想从 PyPI 安装所有其他软件包时:
    1. 配置 Artifact Registry 虚拟仓库
    2. 为多个代码库(包括 PyPI,如果需要)添加配置,并定义 pip 搜索代码库的顺序。
    3. index-url 参数中指定虚拟代码库的网址。
  2. 确定环境存储分区的 URI
  3. 将 pip.conf 文件上传到环境存储分区中的 /config/pip/ 文件夹。
  4. 使用任一可用方法安装软件包。

从 Artifact Registry 仓库安装软件包

您可以在项目中将软件包存储在 Artifact Registry 代码库中,并将环境配置为从中安装。

配置角色和权限:

  1. 确保 Cloud Build 服务账号有权从 Artifact Registry 代码库读取
  2. 向环境的服务账号授予从 Artifact Registry 代码库安装软件包的额外权限,如访问权限控制中所述。
  3. 如果您的环境对项目中的其他服务的访问权限受到限制(例如,如果您使用 VPC Service Controls),请执行以下操作:
    1. 将访问 Artifact Registry 代码库的权限分配给环境的服务账号,而不是 Cloud Build 服务账号。
    2. 确保在项目中配置了与 Artifact Registry 代码库的连接。

如需从 Artifact Registry 代码库安装自定义 PyPI 软件包,请执行以下操作:

  1. 创建一个 pip.conf 文件,如果适用,在文件中包含以下信息:
    • Artifact Registry 仓库的网址(在 index-url 参数中)
    • 代码库的访问凭据
    • 非默认 pip 安装选项
      对于 Artifact Registry 仓库,请将 /simple/ 附加到仓库网址:
[global]  
index-url = https://us-central1-python.pkg.dev/example-project/example-repository/simple/  
  1. (可选)在某些情况下,您可能需要从多个代码库提取软件包,例如,当您的 Artifact Registry 代码库包含您要安装的某些特定软件包,而您又想从 PyPI 安装所有其他软件包时:
    1. 配置 Artifact Registry 虚拟仓库
    2. 为多个代码库(包括 PyPI,如果需要)添加配置,并定义 pip 搜索代码库的顺序。
    3. index-url 参数中指定虚拟代码库的网址。
  2. 将此 pip.conf 文件上传到环境的存储分区中的 /config/pip/ 文件夹。例如:gs://us-central1-example-bucket/config/pip/pip.conf
  3. 使用任一可用方法安装软件包。

从私有代码库安装软件包

您可以在项目的网络中托管私有代码库,并配置环境以从中安装 Python 软件包。

配置角色和权限:

  1. 如果您从项目网络中的代码库安装自定义 PyPI 软件包,并且此代码库没有公共 IP 地址:
    1. 向环境的服务账号分配访问此代码库的权限。
    2. 确保在项目中配置了与此代码库的连接。
  2. 向环境的服务账号授予从私有代码库安装软件包的额外权限,如访问权限控制中所述。

如需从项目网络中托管的私有代码库安装软件包,请执行以下操作:

  1. 创建一个 pip.conf 文件,如果适用,在文件中包含以下信息:
    • 项目网络中代码库的 IP 地址
    • 代码库的访问凭据
    • 非默认 pip 安装选项
      示例:
[global]  
index-url=https://192.0.2.10/  
  1. (可选)在某些情况下,您可能需要从多个代码库提取软件包,例如,当私有代码库包含您要安装的某些特定软件包,而您又想从 PyPI 安装所有其他软件包时:
    1. 配置 Artifact Registry 虚拟仓库
    2. 为多个代码库(包括 PyPI,如果需要)添加配置,并定义 pip 搜索代码库的顺序。
    3. index-url 参数中指定虚拟代码库的网址。
  2. 将 pip.conf 文件上传到环境存储分区中的 /config/pip/ 文件夹。例如:gs://us-central1-example-bucket/config/pip/pip.conf
  3. 使用任一可用方法安装软件包。

安装本地 Python 库

如需安装内部或本地 Python 库,请执行以下操作:

  1. 将依赖项放在环境存储分区的 dags/ 文件夹的子目录中。如需从子目录导入某个模块,该模块的路径中的每个子目录都必须包含一个 __init__.py 软件包标记文件。
    在以下示例中,依赖项为 coin_module.py
dags/  
  use_local_deps.py  # A DAG file.  
  dependencies/  
    __init__.py  
    coin_module.py  
  1. 从 DAG 定义文件导入该依赖项。
    例如:

使用依赖于共享对象库的软件包

某些 PyPI 软件包取决于系统级库。 虽然 Cloud Composer 不支持系统库,但您可以使用以下方法:

在专用 IP 环境中安装软件包

根据您配置项目的方式,您的环境可能无法访问公共互联网。

具有公共互联网访问权限的专用 IP 环境

如果您的专用 IP 环境可以访问公共互联网,则可以使用适用于公共 IP 环境的选项安装软件包:

无互联网访问权限的专用 IP 环境

如果您的专用 IP 环境无法访问公共互联网,您可以使用以下任一方法安装软件包:

在资源位置限制下安装到专用 IP 环境

保证项目符合资源位置限制要求,禁止使用某些工具。具体来说,不能将 Cloud Build 用于安装软件包,从而阻止直接通过公共互联网访问代码库。

如需在此类环境中安装 Python 依赖项,请遵循无法访问互联网的专用 IP 环境的相关指南。

在 VPC Service Controls 边界中将 Python 依赖项安装到专用 IP 环境

使用 VPC Service Controls 边界保护项目会导致进一步的安全限制。具体来说,不能将 Cloud Build 用于安装软件包,从而阻止直接通过公共互联网访问代码库。

如需在边界内为专用 IP 环境安装 Python 依赖项,请遵循无法访问互联网的专用 IP 环境的相关指南。

后续步骤