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 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2
カスタム コンテナ イメージのビルドのサンプル
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}"