設定 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,位於 VM 執行個體的 /opt/conda/miniconda3/bin/python3.7;也可以使用 Python 2.7,其路徑為 /usr/bin/python2.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 解譯器位於 VM 執行個體的 /opt/conda/default/bin 目錄下。以下頁面列出各 Dataproc 映像檔版本內建的 Python 版本:

OS 的非預設 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 叢集。

避免發生套件下載問題

安裝自訂 condapip 套件時,Dataproc 叢集節點會從外部公開 Python 存放區下載套件 (請參閱「conda 相關叢集屬性」)。為避免因公開 Python 存放區無法使用而導致叢集建立失敗,請考慮建立 Dataproc 自訂映像檔,或將依附元件上傳至 Cloud Storage bucket (請參閱「只透過內部 IP 下載依附元件」)。

為工作選擇 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 bucket。

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