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
环境中安装 conda
和 pip
软件包,也可以使用 Conda 相关集群属性在集群上设置您自己的 conda
环境。
如需在 1.5 集群上使用 Python 2.7 作为默认解释器,请勿在创建集群时使用 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.x
conda 安装在 Dataproc 2.x 集群上。默认的 Python3 解释器位于虚拟机实例上的 /opt/conda/default/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.python
和 spark.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 相关的集群属性创建集群时自定义 conda
环境。
创建 Dataproc 集群时,可通过两种互斥的方式自定义 conda 环境:
使用
dataproc:conda.env.config.uri
集群属性在集群上创建并激活新的 Conda 环境。或使用
dataproc:conda.packages
和dataproc:pip.packages
集群属性分别将conda
和pip
软件包添加到集群的conda
base
环境中。
与 Conda 相关的集群属性
dataproc:conda.env.config.uri
:Cloud Storage 中 Conda 环境 YAML 配置文件的绝对路径。此文件将用于在集群上创建并激活新的conda
环境。示例:
获取或创建 conda
environment.yaml
配置文件。您可以手动创建该文件、使用现有文件,或将现有 conda 环境导出到environment.yaml
文件,如下所示。conda env export --name=env-name > environment.yaml
将配置文件复制到您的 Cloud Storage 存储分区:
gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
创建集群并将其指向 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.packages
和dataproc: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.packages
和dataproc: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.packages
和dataproc: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 ...