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
にバイナリへのパスが含まれていることを確認します。
- Java 環境をカスタマイズする場合は、
Python: Dataproc on GKE ベース Spark イメージには
/opt/conda
に Miniconda3 がインストールされています。CONDA_HOME
はこの場所を指します。${CONDA_HOME}/bin
はPATH
に含まれ、PYSPARK_PYTHON
は${CONDA_HOME}/python
に設定されます。Conda をカスタマイズする場合は、
CONDA_HOME
が Conda ホーム ディレクトリを指していて、${CONDA_HOME}/bin
がPATH
に含まれ、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
のユーティリティ パッケージが必要です。これらのユーティリティは 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 ディレクトリで次のコマンドを実行します。
- イメージ(例:
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest
)を設定し、ビルド ディレクトリに変更します。IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}"
BigQuery コネクタをダウンロードします。
gsutil cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
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サンプル初期化スクリプトを作成します。
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
イメージをビルドして push します。
docker build -t "${IMAGE}" . && docker push "${IMAGE}"