Python 環境を構成する

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

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'

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/ で使用できます。

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 は、Managed Service for Apache Spark 2.0 クラスタでは使用できません。

パッケージのダウンロードに関する問題を回避する

Managed Service for Apache Spark クラスタノードは、カスタム condapip パッケージをインストールするときに、外部の公開 Python リポジトリからパッケージをダウンロードします( conda 関連のクラスタ プロパティをご覧ください)。 公開 Python リポジトリを使用できないためにクラスタの作成が失敗しないようにするには、Managed Service for Apache Spark カスタム イメージ を作成するか、依存関係を Cloud Storage バケットにアップロードすることを検討してください( 内部 IP のみのクラスタで依存関係をダウンロードするをご覧ください)。

ジョブの 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 で表示されるバージョンと異なる場合があります。このバージョンの違いが生じる場合は、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 関連の クラスタ プロパティを使用してカスタマイズできます。

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

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

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