Managed Service for Apache Spark 上的 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))
Managed Service for Apache Spark 映像檔 Python 環境
以下各節說明不同 Managed Service for Apache Spark 映像檔版本叢集的 Python 環境。
Managed Service for Apache Spark 映像檔版本 1.5
Miniconda3 已安裝於 Managed Service for Apache Spark 1.5 叢集中。預設解譯器為 Python 3.7,位於 VM 執行個體的 /opt/conda/miniconda3/bin/python3.7;也可以使用 Python 2.7,其路徑為 /usr/bin/python2.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'
Managed Service for Apache Spark 映像檔 2.x 版
conda 已安裝於 Managed Service for Apache Spark 2.x 叢集。預設的 Python3 解譯器位於 VM 執行個體的 /opt/conda/default/bin 目錄下。以下頁面列出各 Managed Service for Apache Spark 映像檔版本內建的 Python 版本:
OS 的非預設 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 不適用於 Managed Service for Apache Spark 2.0 叢集。
避免發生套件下載問題
安裝自訂 conda 和 pip 套件時,Managed Service for Apache Spark 叢集節點會從外部公開 Python 存放區下載套件 (請參閱「conda 相關叢集屬性」)。為避免因公開 Python 存放區無法使用而導致叢集建立失敗,請考慮建立 Managed Service for Apache Spark 自訂映像檔,或將依附元件上傳至 Cloud Storage bucket (請參閱「只透過內部 IP 下載依附元件」)。
為工作選擇 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 環境。
建立 Managed Service for Apache Spark 叢集時,可擇一使用下列兩種方式來自訂 conda 環境:
使用
dataproc:conda.env.config.uri叢集屬性,在叢集上建立並啟用新的 conda 環境;或使用
dataproc:conda.packages和dataproc:pip.packages叢集屬性,分別將conda和pip套件新增至叢集上的condabase環境。
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 bucket。
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 ...