GKE 上の Dataproc カスタム コンテナ イメージ

Dataproc on GKE で使用するカスタム コンテナ イメージを指定できます。カスタム コンテナ イメージは、Dataproc on GKE ベース Spark イメージのいずれかを使用する必要があります。

カスタム コンテナ イメージを使用する

Dataproc on GKE カスタム コンテナ イメージを使用するには、GKE ���想クラスタで Dataproc を作成時、またはクラスタへのSpark ジョブの送信時に spark.kubernetes.container.image property を設定します。

  • gcloud CLI クラスタの作成例:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • gcloud CLI ジョブ送信の例:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

カスタム コンテナ イメージの要件と設定

ベースイメージ

いずれかの公開された Dataproc on GKE ベース Spark イメージ に基づいて、カスタマイズした Docker を作成するための docker ツールを使用できます。

コンテナ ユーザー

Dataproc on GKE は 1099 UID と 1099 GID の Linux spark ユーザーとしてSpark コンテナを実行します。ファイル システムの権限には、UID と GID を使用します。たとえば、イメージ内の /opt/spark/jars/my-lib.jar に jar ファイルをワークロード依存関係として追加する場合は、spark ユーザーにファイルの読み取り権限を付与する必要があります。

コンポーネント

  • Java:JAVA_HOME 環境変数は、Java のインストール場所を指します。現在のデフォルト値は /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64 です(変更される場合があります)。詳細については、Dataproc のリリースノートをご覧ください。

    • Java 環境をカスタマイズする場合は、JAVA_HOME が正しいロケーションに設定され、PATH にバイナリへのパスが含まれていることを確認します。
  • Python: Dataproc on GKE ベース Spark イメージには /opt/conda に Miniconda3 がインストールされています。CONDA_HOME はこの場所を指します。${CONDA_HOME}/binPATH に含まれ、PYSPARK_PYTHON${CONDA_HOME}/python に設定されます。

    • Conda をカスタマイズする場合は、CONDA_HOME が Conda ホーム ディレクトリを指していて、${CONDA_HOME}/binPATH に含まれ、PYSPARK_PYTHON${CONDA_HOME}/python. に設定されていることを確認します。

    • デフォルトのベース環境でパッケージをインストール、削除、更新することも、新しい環境を作成することもできますが、ベース コンテナ イメージのベース環境にインストールされているすべてのパッケージを環境に含めることを強くおすすめします。

    • ユーティリティ関数を含む Python スクリプトなどの Python モジュールをコンテナ イメージに追加する場合は、PYTHONPATH にモジュール ディレクトリを含めます。

  • Spark: Spark は /usr/lib/spark にインストールされ、SPARK_HOME はこの場所を指します。Spark はカスタマイズできません。変更されている場合、コンテナ イメージが拒否されるか、正常に動作しません。

    • ジョブ: Spark ジョブの依存関係をカスタマイズできます。SPARK_EXTRA_CLASSPATH は、Spark JVM プロセス用の追加のクラスパスを定義します。推奨: jar を /opt/spark/jars に配置し、SPARK_EXTRA_CLASSPATH/opt/spark/jars/* に設定します。

      ジョブ jar をイメージに埋め込む場合、推奨されるディレクトリは /opt/spark/job です。ジョブを送信するときに、file:///opt/spark/job/my-spark-job.jar などのローカルパスを使用してジョブを参照できます。

    • Cloud Storage コネクタ: Cloud Storage コネクタは /usr/lib/spark/jars にインストールされます。

    • ユーティリティ: Spark を実行するには、procpstini のユーティリティ パッケージが必要です。これらのユーティリティは base Spark イメージに含まれているため、カスタム イメージをインストールする必要はありません。

    • エントリポイント: Dataproc on GKE は、コンテナ イメージの ENTRYPOINT および CMD プリミティブに対して行われた変更を無視します。

    • 初期化スクリプト: /opt/init-script.sh でオプションの初期化スクリプトを追加できます。初期化スクリプトを使用して、Cloud Storage からファイルをダウンロードしたり、コンテナ内でプロキシを起動したり、他のスクリプトを呼び出したり、その他の起動タスクを実行したりできます。

      Spark ドライバ、Spark エグゼキュータ、その他のプロセスを開始する前に、すべてのエントリ引数($@)を指定して初期化スクリプトを呼び出します。初期化スクリプトは、最初の引数($1)に基づいて Spark プロセスのタイプを選択できます。有効な値は、ドライバ コンテナの場合は spark-submit、エグゼキュータ コンテナの場合は executor などです。

  • 構成: Spark 構成は /etc/spark/conf にあります。SPARK_CONF_DIR 環境変数は、この場所を表します。

    コンテナ イメージ内の Spark 構成はカスタマイズしないでください。代��りに、次の理由から Dataproc on GKE API を介してプロパティを送信します。

    • エグゼキュータのメモリサイズなどの一部のプロパティは、コンテナ イメージのビルド時ではなく実行時に決定されます。GKE 上の Dataproc によって挿入される必要があります。
    • GKE on Dataproc は、ユーザー指定のプロパティを制限を設けます。GKE 上の Dataproc は構成を configMap からコンテナ内の /etc/spark/conf にマウントし、イメージに埋め込まれた設定をオーバーライドします。

ベース・Spark イメージ

Dataproc では、次の基本の Spark コンテナ イメージがサポートされています。

  • Spark 2.4: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_1.5
  • Spark 3.1: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0

カスタム コンテナ イメージのビルドのサンプル

サンプル Dockerfile

FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest

# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root

# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
    && chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
    spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage

# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh

# (Optional) Set user back to `spark`.
USER spark

コンテナ イメージのビルド

Dockerfile ディレクトリで次のコマンドを実行します。

  1. イメージ(例: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest)を設定し、ビルド ディレクトリに変更します。
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. BigQuery コネクタをダウンロードします。

    gsutil cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. Python サンプル ファイルを作成します。

    cat >test_util.py <<'EOF'
    def hello(name):
      print("hello {}".format(name))
    def read_lines(path):   with open(path) as f:     return f.readlines() EOF

  4. サンプル初期化スクリプトを作成します。

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. イメージをビルドして push します。

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"