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}"