配置 Dataproc Python 环境

Dataproc 上的 PySpark 作业由集群上的 Python 解释器运行。作业代码在运行时必须与 Python 解释器版本兼容 和依赖项。

检查解释器版本和模块

以下 check_python_env.py 示例程序检查运行作业的 Linux 用户、Python 解释器和可用模块。

import getpass
import sys
import imp

print('This job is running as "{}".'.format(getpass.getuser()))
print(sys.executable, sys.version_info)
for package in sys.argv[1:]:
  print(imp.find_module(package))

运行此程序

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    -- pandas scipy

输出示例

This job is running as "root".
('/usr/bin/python', sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0))
(None, '/usr/local/lib/python2.7/dist-packages/pandas', ('', '', 5))
(None, '/usr/local/lib/python2.7/dist-packages/scipy', ('', '', 5))

Dataproc 映像 Python 环境

以下部分介绍了适用于不同 API 的 Python 环境, Dataproc 映像版本集群。

Dataproc 映像版本 1.5

Miniconda3 安装在 Dataproc 1.5 集群上。默认解释器是 Python 3.7,它位于虚拟机实例上 /opt/conda/miniconda3/bin/python3.7/usr/bin/python2.7 还提供 Python 2.7。

您可以在 base 环境中安装 condapip 软件包,或者 设置自己的conda环境 与 conda 相关的集群属性

如需在 1.5 集群上使用 Python 2.7 作为默认解释器,请勿在创建集群时使用 Anaconda 可选组件。而应使用 conda 初始化操作 安装 Miniconda2 并使用 与 conda 相关的集群属性 以在 base 环境中安装 condapip 软件包,或设置您的 拥有自己的 conda 环境。

示例

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.5 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh \
    --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

Dataproc 映像版本 2.x

conda 是 Dataproc 2.x 集群。默认的 Python3 解释器位于 创建在 /opt/conda/default/bin 下的虚拟机实例上。以下页面列表 Dataproc 映像版本中包含的 Python 版本:

操作系统中的非默认 Python 解释器位于 /usr/bin/ 下。

您可以在 base 环境中安装 condapip 软件包,也可以设置 自己的conda环境 与 conda 相关的集群属性

示例

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=2.0 \
    --region=${REGION} \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

注意:Anaconda 不适用于 Dataproc 2.0 集群。

为作业选择 Python 解释器

如果您的集群上安装了多个 Python 解释器,则系统会运行 /etc/profile.d/effective-python.sh,导出 PYSPARK_PYTHON 环境变量以为 PySpark 作业选择默认 Python 解释器。如果您需要为 PySpark 作业选择非默认的 Python 解释器,请在将作业提交到集群时,将 spark.pyspark.pythonspark.pyspark.driver.python 属性设置为所需的 Python 版本号(例如“python2.7” 或“python3.6”)。

示例

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    --properties="spark.pyspark.python=python2.7,spark.pyspark.driver.python=python2.7"

使用 sudo 运行 Python

如果您通过 SSH 连接到安装了 Miniconda 或 Anaconda 的集群节点,则在运行 sudo python --version 时,显示的 Python 版本可能与 python --version 显示的版本不同。由于 sudo 使用默认的系统 Python /usr/bin/python,并且不执行 /etc/profile.d/effective-python.sh 来初始化 Python 环境,因此可能会发生此版本差异。为了在使用 sudo 时获得一致的体验,请找到 /etc/profile.d/effective-python.sh 中设置的 Python 路径,然后运行 env 命令将 PATH 设置为此 Python 路径。以下是 1.5 集群示例:

sudo env PATH=/opt/conda/default/bin:${PATH} python --version

您可以在创建集群期间使用 conda 相关选项自定义 conda 环境 集群属性

创建 Dataproc 集群时,可通过两种互斥的方式自定义 conda 环境:

  1. 使用 dataproc:conda.env.config.uri 集群属性创建并激活 一个新的 conda 环境。

  2. 使用 dataproc:conda.packagesdataproc:pip.packages 集群 用于分别将 condapip 软件包添加到 conda base 的属性 集群环境

  • dataproc:conda.env.config.uri: conda 环境 YAML 配置文件,位于 Cloud Storage 中。 此文件将用于在集群上创建和激活新的 conda 环境。

    示例

    1. 获取或创建 conda environment.yaml 配置文件。您可以手动创建该文件、使用现有文件,或将现有 conda 环境导出environment.yaml 文件,如下所示。

      conda env export --name=env-name > environment.yaml
      

    2. 将配置文件复制到您的 Cloud Storage 存储分区:

      gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
      

    3. 创建集群并将其指向 Cloud Storage 中的环境配置文件。

      REGION=region
      gcloud dataproc clusters create cluster-name \
          --region=${REGION} \
          --properties='dataproc:conda.env.config.uri=gs://bucket-name/environment.yaml' \
          ... other flags ...
      

  • dataproc:conda.packages:包含要在基础环境中安装的特定版本的 conda 软件包的列表,格式为 pkg1==v1,pkg2==v2...。如果 conda 无法解析 与基础环境中的现有软件包冲突, 软件包将不会安装。

    注意:

    • dataproc:conda.packagesdataproc:pip.packages 集群属性不能与 dataproc:conda.env.config.uri 集群属性搭配使用。

    • 指定多个软件包(以英文逗号分隔)时,您必须指定备用分隔符(请参阅集群属性格式)。以下示例指定“#”作为分隔符,以便将多个以英文逗号分隔的软件包名称传递给 dataproc:conda.packages 属性。

    示例

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:conda.packages=pytorch==1.7.1,coverage==5.5' \
    ... other flags ...

  • dataproc:pip.packages:包含特定pip 要在基础环境中安装的版本,格式如下: pkg1==v1,pkg2==v2...。`pip 仅在必要时升级现有依赖项。冲突可能会导致环境不一致。

    注意:

    • dataproc:pip.packagesdataproc:conda.packages 集群属性不能与 dataproc:conda.env.config.uri 集群属性搭配使用。

    • 指定多个软件包(以英文逗号分隔)时,您必须指定备用分隔符(请参阅集群属性格式)。以下示例指定“#”作为分隔符,以便将多个以英文逗号分隔的软件包名称传递给 dataproc:pip.packages 属性。

    示例

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:pip.packages=tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...
  • 您可以在创建集群时同时使用 dataproc:conda.packagesdataproc:pip.packages

    示例

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --image-version=1.5 \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...