您可以指定要搭配 Dataproc on GKE 使用的自訂容器映像檔。 自訂容器映像檔必須使用其中一個 Dataproc on GKE 基本 Spark 映像檔。
使用自訂容器映像檔
如要使用 Dataproc on GKE 自訂容器映像檔,請在建立 Dataproc 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 ...
自訂容器映像檔需求和設定
基本映像檔
您可以透過 docker 工具,根據已發布的 Dataproc on GKE 基本 Spark 映像檔,建構自訂 Docker。
容器使用者
Dataproc on GKE 會以 Linux spark 使用者身分執行 Spark 容器,並使用 1099 UID 和 1099 GID。使用 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 下載檔案、在容器中啟動 Proxy、呼叫其他指令碼,以及執行其他啟動工作。啟動 Spark 驅動程式、Spark 執行器和其他程序之前,進入點指令碼會使用所有指令列引數 (
$@) 呼叫初始化指令碼。初始化指令碼可以根據第一個引數 ($1) 選取 Spark 處理序類型,可能的值包括驅動程式容器的spark-submit,以及執行器容器的executor。
設定:Spark 設定位於
/etc/spark/conf下方。SPARK_CONF_DIR環境變數會指向這個位置。請勿在容器映像檔中自訂 Spark 設定。請改為透過 Dataproc on GKE API 提交任何屬性,原因如下:
- 部分屬性 (例如執行器記憶體大小) 是在執行階段決定,而非在容器映像檔建構階段決定,因此必須由 Dataproc on GKE 注入。
- Dataproc on GKE 會限制使用者提供的屬性。
Dataproc on GKE 會將
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
建構並推送映像檔。
docker build -t "${IMAGE}" . && docker push "${IMAGE}"