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 を実行するには、procps および tini ユーティリティ パッケージが必要です。これらのユーティリティは ベース 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 コネクタをダウンロードします。

    gcloud storage 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. サンプルの init スクリプトを作成します。

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

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

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