設定 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 的 VM 執行個體上。/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 底下的 VM 執行個體中。下列頁面列出 Dataproc 映像檔版本中包含的 Python 版本:

系統會在 /usr/bin/ 下方提供非預設的 Python 解譯器。

您可以在 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 ...