クラスタの 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))

プログラムを実行する

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 イメージ バージョン 1.0、1.1、1.2

1.0、1.1、1.2 のイメージ バージョン クラスタでは、デフォルトの Python インタープリタは Python 2.7 で、VM インスタンスの /usr/bin/python2.7 にあります。Python パッケージは、pip install 初期化アクションを介してインストールできます(次の例ではパッケージのバージョンを指定しています。これは省略できますが、指定することをおすすめします)。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.2 \
    --region=${REGION} \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

別の Python インタープリタが必要な場合は、conda 初期化アクションを使用して Conda パッケージおよび PIP パッケージとともに Miniconda をインストールできます。

次のコマンドは、1.2 イメージ バージョンの Dataproc クラスタを作成し、Conda パッケージと PIP パッケージとともに最新バージョンの Miniconda3 をインストールします。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.2 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=3' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

Dataproc イメージ バージョン 1.3

1.3 のイメージ バージョン クラスタでは、デフォルトの Python インタープリタは Python 2.7 で、VM インスタンスの /usr/bin/python2.7 にインストールされています。Python パッケージは pip install 初期化アクションを使用してインストールできます。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

別の Python インタープリタが必要な場合は、pip install 初期化アクションを使用して Anaconda のオプション コンポーネントでクラスタを作成し、Conda パッケージと PIP パッケージをインストールできます。

次のコマンドは、1.3 イメージ バージョンのクラスタを作成し、Anaconda2 および Conda パッケージと PIP パッケージをインストールします。

REGION=region
gcloud beta dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --optional-components=ANACONDA \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Anaconda のオプション コンポーネントをインストールする場合、PySpark ジョブのデフォルトの Python インタープリタは /opt/conda/anaconda/bin/python2.7 です。

Python 3 を 1.3 クラスタでデフォルトのインタープリタとして使用するには、クラスタの作成時にAnaconda のオプション コンポーネントを使用しないでください。代わりに、conda 初期化アクションを使用して、Miniconda3 および Conda パッケージと PIP パッケージをクラスタにインストールします。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.3 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=3' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow=1.12.0' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

Dataproc イメージ バージョン 1.4 以降

Miniconda3 は Dataproc 1.4 以降のクラスタにインストールされます。デフォルトの Python インタープリタは、Dataproc 1.4 用の Python 3.6 と Dataproc 1.5 用の Python 3.7 です。それぞれ VM インスタンスの /opt/conda/miniconda3/bin/python3.6/opt/conda/miniconda3/bin/python3.7 にあります。Python 2.7 は /usr/bin/python2.7 でも利用できます。

Conda パッケージと PIP パッケージは、conda 初期化アクションpip install 初期化アクションを使用してインストールできます。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Miniconda3 の代わりに Anaconda3 をインストールするには、Anaconda のオプション コンポーネントを選択し、conda 初期化アクションpip install 初期化アクションを使用して Conda パッケージと PIP パッケージをインストールします。

REGION=region
gcloud beta dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --optional-components=ANACONDA \
    --metadata='CONDA_PACKAGES=scipy=1.1.0 tensorflow' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/python/conda-install.sh,gs://goog-dataproc-initialization-actions-${REGION}/python/pip-install.sh

Anaconda3 のオプション コンポーネントをインストールすると、Miniconda3 がクラスタから削除され、/opt/conda/anaconda3/bin/python3.6 が PySpark ジョブのデフォルトの Python インタープリタになります。オプション コンポーネントの Python インタープリタのバージョンは変更できません。

Python 2.7 を 1.4 以降のクラスタでデフォルトのインタープリタとして使用するには、クラスタの作成時に Anaconda のオプション コンポーネントを使用しないでください。代わりに、conda 初期化アクションを使用して、Miniconda2 および Conda パッケージと PIP パッケージをクラスタにインストールします。

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.4 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --metadata='CONDA_PACKAGES=scipy=1.0.0 tensorflow=1.12.0' \
    --metadata='PIP_PACKAGES=pandas==0.23.0 scipy==1.1.0' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh,gs://goog-dataproc-initialization-actions-${REGION}/conda/install-conda-env.sh

ジョブの 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」など)。

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.4 クラスタの例を次に示します。

sudo env PATH=/opt/conda/default/bin:${PATH} python --version