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
的 VM 執行個體上。/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
底下的 VM 執行個體中。下列頁面列出 Dataproc 映像檔版本中包含的 Python 版本:
系統會在 /usr/bin/
下方提供非預設的 Python 解譯器。
您可以在 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 ...