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
ユーティリティ パッケージが必要です。これらのユーティリティは ベース 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 コネクタをダウンロードします。
gcloud storage 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サンプルの init スクリプトを作成します。
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
イメージをビルドして push します。
docker build -t "${IMAGE}" . && docker push "${IMAGE}"