配置 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 环境

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

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:Cloud Storage 中 Conda 环境 YAML 配置文件的绝对路径。此文件将用于在集群上创建并激活新的 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 ...