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 でも利用できます。

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

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 関連のクラスタ プロパティを使用してカスタマイズできます。

Dataproc クラスタの作成時に、Conda 環境をカスタマイズする方法は相互排他的に 2 つあります。

  1. dataproc:conda.env.config.uri クラスタ プロパティを使用して、クラスタ上に新しい Conda 環境を作成して有効にします。または

  2. dataproc:conda.packages および dataproc:pip.packages クラスタ プロパティを使用して、クラスタ上の conda base 環境にそれぞれ conda および pip パッケージを追加します。

  • dataproc:conda.env.config.uri: Cloud Storage にある Conda 環境 YAML 構成ファイルへの絶対パス。このファイルは、クラスタ上で新しい conda 環境を作成して有効にするために使用されます。

    で使用することはできません。

    例:

    1. conda environment.yaml 構成ファイルを取得または作成します。次に示すように、ファイルを手動で作成するか、既存のファイルを使用するか、environment.yaml ファイルに既存の Conda 環境をエクスポートできます。

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