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
でも利用できます。
conda
パッケージと pip
パッケージを base
環境にインストールするか、Conda 関連のクラスタ プロパティを使用して、クラスタに独自の conda
環境をセットアップできます。
Python 2.7 を 1.5 のクラスタでデフォルトのインタープリタとして使用するには、クラスタの作成時に Anaconda のオプション コンポーネントを使用しないでください。代わりに、Conda 初期化アクションを使用して Miniconda2 をインストールし、Conda 関連のクラスタ プロパティを使用して conda
パッケージと pip
パッケージを base
環境にインストールするか、独自の 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/
で使用できます。
conda
パッケージと pip
パッケージを base
環境にインストールするか、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
Miniconda または Anaconda がインストールされているクラスタノードに SSH 接続する場合、sudo python --version
を実行すると、表示される Python のバージョンが python --version
で表示されるバージョンと異なる場合があります。このバージョンの違いは、Python 環境の初期化の際に、sudo
がデフォルト システムの Python /usr/bin/python
を使用し、/etc/profile.d/effective-python.sh
を実行していないために発生する可能性があります。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 環境をカスタマイズする方法は相互排他的に 2 つあります。
dataproc:conda.env.config.uri
クラスタ プロパティを使用して、クラスタ上に新しい Conda 環境を作成して有効にします。またはdataproc:conda.packages
およびdataproc:pip.packages
クラスタ プロパティを使用して、クラスタ上のconda
base
環境にそれぞれconda
およびpip
パッケージを追加します。
conda 関連のクラスタ プロパティ
で使用することはできません。dataproc:conda.env.config.uri
: Cloud Storage にある Conda 環境 YAML 構成ファイルへの絶対パス。このファイルは、クラスタ上で新しいconda
環境を作成して有効にするために使用されます。例:
conda
environment.yaml
構成ファイルを取得または作成します。次に示すように、ファイルを手動で作成するか、既存のファイルを使用するか、environment.yaml
ファイルに既存の Conda 環境をエクスポートできます。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 ...