Managed Service for Apache Spark on GKE で使用するカスタム コンテナ イメージを指定できます。カスタム コンテナ イメージでは、Managed Service for Apache Spark on GKE のベース Spark イメージのいずれかを使用する必要があります。
カスタム コンテナ イメージを使用する
Managed Service for Apache Spark on GKE カスタム コンテナ イメージを使用するには、Managed Service for Apache Spark on GKE 仮想クラスタを作成するとき、またはクラスタに 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 ...
カスタム コンテナ イメージの要件と設定
ベースイメージ
いずれかの公開された Managed Service for Apache Spark on GKE ベース Spark イメージ に基づいて、カスタマイズした Docker を作成するための docker ツールを使用できます。
コンテナ ユーザー
Managed Service for Apache Spark 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ですが、変更される可能性があります(最新情報については、Managed Service for Apache Spark リリースノートをご覧ください)。- Java 環境をカスタマイズする場合は、
JAVA_HOMEが正しい場所に設定され、PATHにバイナリのパスが含まれていることを確認します。
- Java 環境をカスタマイズする場合は、
Python: GKE の Managed Service for Apache Spark のベース 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 イメージに含まれているため、カスタム イメージで再インストールする必要はありません。エントリポイント: GKE 上の Managed Service for Apache Spark は、コンテナ イメージの
ENTRYPOINTおよびCMDプリミティブに対して行われた変更を無視します。初期化スクリプト:
/opt/init-script.shでオプションの初期化スクリプトを追加できます。 初期化スクリプトを使用すると、Cloud Storage からのファイルのダウンロード、コンテナ内でプロキシの起動、他のスクリプトの呼び出し、他の起動タスクの実行ができます。エントリポイント スクリプトは、Spark ドライバ、Spark エグゼキュータ、その他のプロセスを開始する前に、すべてのコマンドライン引数(
$@)を使用して初期化スクリプトを呼び出します。初期化スクリプトは、最初の引数($1)に基づいて Spark プロセスのタイプを選択できます。有効な値は、ドライバ コンテナの場合はspark-submit、エグゼキュータ コンテナの場合はexecutorなどです。
構成: Spark 構成は
/etc/spark/confにあります。SPARK_CONF_DIR環境変数はこの場所を参照します。コンテナ イメージで Spark 構成をカスタマイズしないでください。代わりに、次の理由から、Managed Service for Apache Spark on GKE API を使用してプロパティを送信します。
- エグゼキュータのメモリサイズなどの一部のプロパティは、コンテナ イメージのビルド時ではなく実行時に決定されます。GKE 上の Managed Service for Apache Spark によって挿入される必要があります。
- GKE 上の Managed Service for Apache Spark は、ユーザー指定のプロパティを制限します。GKE 上の Managed Service for Apache Spark は構成を
configMapからコンテナ内の/etc/spark/confにマウントし、イメージに埋め込まれた設定をオーバーライドします。
ベース・Spark イメージ
Managed Service for Apache Spark は、次のベースの 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}"