配置 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 映像版本 1.5

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

您可以在 base 环境中安装 Conda 和 PIP 软件包,也可以使用 Conda 相关集群属性在集群上设置您自己的 Conda 环境。

如需安装 Anaconda3 而不是 Miniconda3,请选择 Anaconda 可选组件,并在 base 环境中安装 Conda 和 PIP 软件包,或者使用 Conda 相关集群属性自行设置集群上的 Conda 环境。

示例

REGION=region
gcloud beta dataproc clusters create my-cluster \
    --image-version=1.5 \
    --region=${REGION} \
    --optional-components=ANACONDA \
    --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

安装 Anaconda3 可选组件后,系统会将 Miniconda3 从集群中删除,/opt/conda/anaconda3/bin/python3.6 成为 PySpark 作业的默认 Python 解释器。您无法更改可选组件的 Python 解释器版本。

如需将 Python 2.7 用作 1.5 集群上的默认解释器,请不要在创建集群时使用 Anaconda 可选组件。请改为使用 Conda 初始化操作来安装 Miniconda2,并使用 Conda 相关集群属性在设置 base 环境中安装 Conda 和 PIP 软件包,或者在集群上设置自己的 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.0 及更高版本

Miniconda3 安装在 Dataproc 2.0 及更高版本的集群上。默认的 Python3 解释器位于虚拟机实例上的 /opt/conda/miniconda3/bin/ 下。以下页面列出了 Dataproc 映像版本中包含的 Python 版本:

操作系统中的非默认 Python 解释器在 /usr/bin/ 下提供。

您可以在 base 环境中安装 Conda 和 PIP 软件包,也可以使用 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 集群属性分别将 Conda 和 PIP 软件包添加到集群的 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 存储桶:

      gsutil 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 ...