Menggunakan container kustom

Managed Service untuk Apache Spark menjalankan workload dalam container Docker. Container menyediakan lingkungan runtime untuk proses driver dan eksekutor workload. Secara default, Managed Service untuk Apache Spark menggunakan image container yang menyertakan paket Spark, Java, Python, dan R default yang terkait dengan versi rilis runtime. Managed Service untuk Apache Spark batches API memungkinkan Anda menggunakan image container kustom, bukan image default. Biasanya, image container kustom menambahkan dependensi Java atau Python workload Spark yang tidak disediakan oleh image container default. Penting: Jangan sertakan Spark dalam image container kustom Anda; Managed Service untuk Apache Spark akan memasang Spark ke dalam container saat runtime.

Mengirim workload batch Spark menggunakan image container kustom

gcloud

Gunakan perintah gcloud dataproc batches submit spark dengan tanda --container-image untuk menentukan image container kustom saat Anda mengirim workload batch Spark.

gcloud dataproc batches submit spark \
    --container-image=custom-image, for example, "gcr.io/my-project-id/my-image:1.0.1" \
    --region=region \
    --jars=path to user workload jar located in Cloud Storage or included in the custom container \
    --class=The fully qualified name of a class in the jar file, such as org.apache.spark.examples.SparkPi \
    -- add any workload arguments here

Catatan:

  • Custom-image: Tentukan image container kustom menggunakan format penamaan image Container Registry berikut: {hostname}/{project-id}/{image}:{tag}, misalnya, "gcr.io/my-project-id/my-image:1.0.1". Catatan: Anda harus menghosting image container kustom di Container Registry atau Artifact Registry. (Managed Service untuk Apache Spark tidak dapat mengambil container dari registry lain).
  • --jars: Tentukan jalur ke workload pengguna yang disertakan dalam image container kustom Anda atau yang berada di Cloud Storage, misalnya, file:///opt/spark/jars/spark-examples.jar atau gs://my-bucket/spark/jars/spark-examples.jar.
  • Opsi perintah batch lainnya: Anda dapat menambahkan tanda perintah batch opsional lainnya, misalnya, untuk menggunakan Persistent History Server (PHS). Catatan: PHS harus berada di region tempat Anda menjalankan workload batch.
  • argumen workloadAnda dapat menambahkan argumen workload apa pun dengan menambahkan "--" ke akhir perintah, diikuti dengan argumen workload.

REST

Image container kustom disediakan melalui RuntimeConfig.containerImage kolom sebagai bagian dari batches.create permintaan API.

Contoh berikut menunjukkan cara menggunakan container kustom untuk mengirim workload batch menggunakan Managed Service untuk Apache Spark batches.create API.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • project-id: Project ID Google Cloud
  • region: region
  • custom-container-image: Tentukan image container kustom menggunakan format penamaan image Container Registry berikut: {hostname}/{project-id}/{image}:{tag}, misalnya, "gcr.io/my-project-id/my-image:1.0.1". Catatan: Anda harus menghosting container kustom di Container Registry atau Artifact Registry . (Managed Service untuk Apache Spark tidak dapat mengambil container dari registry lain).
  • jar-uri: Tentukan jalur ke jar workload yang disertakan dalam image container kustom Anda atau yang berada di Cloud Storage, misalnya, "/opt/spark/jars/spark-examples.jar" atau "gs:///spark/jars/spark-examples.jar".
  • class: Nama lengkap class dalam file jar, seperti "org.apache.spark.examples.SparkPi".
  • Opsi lainnya: Anda dapat menggunakan kolom resource workload batch lainnya, misalnya, gunakan kolom sparkBatch.args untuk meneruskan argumen ke workload Anda (lihat dokumentasi resource Batch untuk mengetahui informasi selengkapnya). Untuk menggunakan a Persistent History Server (PHS), lihat Menyiapkan Persistent History Server. Catatan: PHS harus berada di region tempat Anda menjalankan workload batch.

Metode HTTP dan URL:

POST https://dataproc.googleapis.com/v1/projects/project-id/locations/region/batches

Meminta isi JSON:

{
  "runtimeConfig":{
    "containerImage":"custom-container-image
  },
  "sparkBatch":{
    "jarFileUris":[
      "jar-uri"
    ],
    "mainClass":"class"
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan melihat respons JSON seperti berikut:

{
"name":"projects/project-id/locations/region/batches/batch-id",
  "uuid":",uuid",
  "createTime":"2021-07-22T17:03:46.393957Z",
  "runtimeConfig":{
    "containerImage":"gcr.io/my-project/my-image:1.0.1"
  },
  "sparkBatch":{
    "mainClass":"org.apache.spark.examples.SparkPi",
    "jarFileUris":[
      "/opt/spark/jars/spark-examples.jar"
    ]
  },
  "runtimeInfo":{
    "outputUri":"gs://dataproc-.../driveroutput"
  },
  "state":"SUCCEEDED",
  "stateTime":"2021-07-22T17:06:30.301789Z",
  "creator":"account-email-address",
  "runtimeConfig":{
    "properties":{
      "spark:spark.executor.instances":"2",
      "spark:spark.driver.cores":"2",
      "spark:spark.executor.cores":"2",
      "spark:spark.app.name":"projects/project-id/locations/region/batches/batch-id"
    }
  },
  "environmentConfig":{
    "peripheralsConfig":{
      "sparkHistoryServerConfig":{
      }
    }
  },
  "operation":"projects/project-id/regions/region/operation-id"
}

Membangun image container kustom

Image container kustom Managed Service untuk Apache Spark adalah image Docker. Anda dapat menggunakan alat untuk membangun image Docker guna membangun image container kustom, tetapi ada kondisi yang harus dipenuhi image agar kompatibel dengan Managed Service untuk Apache Spark. Bagian berikut menjelaskan kondisi ini.

Sistem operasi

Anda dapat memilih image dasar sistem operasi apa pun untuk image container kustom Anda.

Rekomendasi: Gunakan image Debian 12 default, misalnya, debian:12-slim, karena telah diuji untuk menghindari masalah kompatibilitas.

Utilitas

Anda harus menyertakan paket utilitas berikut, yang diperlukan untuk menjalankan Spark, dalam image container kustom Anda:

  • procps
  • tini

Untuk menjalankan XGBoost dari Spark (Java atau Scala), Anda harus menyertakan libgomp1

Pengguna container

Managed Service untuk Apache Spark menjalankan container sebagai pengguna Linux spark dengan UID 1099 dan GID 1099. Petunjuk USER yang ditetapkan dalam Dockerfile image container kustom akan diabaikan saat runtime. Gunakan UID dan GID untuk izin sistem file. Misalnya, jika Anda menambahkan file jar di /opt/spark/jars/my-lib.jar dalam image sebagai dependensi workload, Anda harus memberikan izin baca kepada pengguna spark untuk the file.

Image streaming

Managed Service untuk Apache Spark biasanya memulai workload yang memerlukan image container kustom dengan mendownload seluruh image ke disk. Hal ini dapat menyebabkan penundaan waktu inisialisasi, terutama bagi pelanggan dengan image besar.

Sebagai gantinya, Anda dapat menggunakan image streaming, yang merupakan metode untuk menarik data image sesuai kebutuhan. Hal ini memungkinkan workload dimulai tanpa menunggu seluruh image didownload, sehingga berpotensi meningkatkan waktu inisialisasi. Untuk mengaktifkan image streaming, Anda harus mengaktifkan Container File System API. Anda juga harus menyimpan image container di Artifact Registry dan repositori Artifact Registry harus berada di region yang sama dengan Managed Service untuk workload Apache Spark Anda atau di multi-region yang sesuai dengan region tempat workload Anda berjalan. Jika Managed Service untuk Apache Spark tidak mendukung image atau layanan image streaming tidak tersedia, penerapan streaming kami akan mendownload seluruh image.

Perhatikan bahwa kami tidak mendukung hal berikut untuk image streaming:

Dalam kasus ini, Managed Service untuk Apache Spark akan menarik seluruh image sebelum memulai workload.

Spark

Jangan sertakan Spark dalam image container kustom Anda. Saat runtime, Managed Service untuk Apache Spark memasang biner dan konfigurasi Spark dari host ke dalam container: biner dipasang ke direktori /usr/lib/spark dan konfigurasi dipasang ke direktori /etc/spark/conf. File yang ada di direktori ini akan diganti oleh Managed Service untuk Apache Spark saat runtime.

Java Runtime Environment

Jangan sertakan Java Runtime Environment (JRE) Anda sendiri dalam image container kustom Anda. Saat runtime, Managed Service untuk Apache Spark memasang OpenJDK dari host ke dalam container. Jika Anda menyertakan JRE dalam image container kustom Anda, JRE tersebut akan diabaikan.

Paket Java

Anda dapat menyertakan file jar sebagai dependensi workload Spark dalam image container kustom Anda, dan Anda dapat menetapkan variabel lingkungan SPARK_EXTRA_CLASSPATH untuk menyertakan jar. Managed Service untuk Apache Spark akan menambahkan nilai variabel lingkungan di classpath proses Spark JVM. Rekomendasi: letakkan jar di direktori /opt/spark/jars dan tetapkan SPARK_EXTRA_CLASSPATH ke /opt/spark/jars/*.

Anda dapat menyertakan jar workload dalam image container kustom Anda, lalu mereferensikannya dengan jalur lokal saat mengirimkan workload, misalnya file:///opt/spark/jars/my-spark-job.jar (lihat Mengirim workload batch Spark menggunakan image container kustom untuk mengetahui contohnya).

Paket Python

Secara default, Managed Service untuk Apache Spark memasang build lingkungan Conda menggunakan repo OSS Conda-Forge dari host ke direktori /opt/dataproc/conda dalam container saat runtime. PYSPARK_PYTHON ditetapkan ke /opt/dataproc/conda/bin/python. Direktori dasarnya, /opt/dataproc/conda/bin, disertakan dalam PATH.

Anda dapat menyertakan lingkungan Python dengan paket di direktori lain dalam image container kustom Anda, misalnya di /opt/conda, dan menetapkan PYSPARK_PYTHON variabel lingkungan ke /opt/conda/bin/python.

Image container kustom Anda dapat menyertakan modul Python lain yang bukan bagian dari lingkungan Python, misalnya, skrip Python dengan fungsi utilitas. Tetapkan variabel lingkungan PYTHONPATH untuk menyertakan direktori tempat modul berada.

Lingkungan R

Anda dapat menyesuaikan lingkungan R dalam image container kustom Anda menggunakan salah satu opsi berikut:

  • Gunakan Conda untuk mengelola dan menginstal paket R dari saluran conda-forge.
  • Tambahkan repositori R untuk OS Linux image container Anda, dan instal paket R menggunakan pengelola paket OS Linux (lihat Indeks paket Software R).

Saat menggunakan salah satu opsi, Anda harus menetapkan variabel lingkungan R_HOME untuk mengarah ke lingkungan R kustom Anda. Pengecualian: Jika Anda menggunakan Conda untuk mengelola lingkungan R dan menyesuaikan lingkungan Python, Anda tidak perlu menetapkan variabel lingkungan R_HOME; variabel ini akan otomatis ditetapkan berdasarkan variabel lingkungan PYSPARK_PYTHON.

Contoh build image container kustom

Bagian ini mencakup contoh build image container kustom, yang menyertakan contoh Dockerfiles, diikuti dengan perintah build. Satu contoh menyertakan konfigurasi minimum yang diperlukan untuk membangun image. Contoh lainnya menyertakan contoh konfigurasi tambahan, termasuk library Python dan R.

Konfigurasi minimum

# Recommendation: Use Debian 12.
FROM debian:12-slim

# Suppress interactive prompts.
ENV DEBIAN_FRONTEND=noninteractive

# Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini libjemalloc2

# Enable jemalloc as default memory allocator.
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2

# Create the 'spark' group/user.
# The GID and UID must be 1099. Home directory is required.
RUN groupadd -g 1099 spark
RUN useradd -u 1099 -g 1099 -d /home/spark -m spark
USER spark
    

Konfigurasi tambahan

# Recommendation: Use Debian 12.
FROM debian:12-slim

# Suppress interactive prompts.
ENV DEBIAN_FRONTEND=noninteractive

# Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini libjemalloc2

# Enable jemalloc as default memory allocator
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2

# Install utilities required by XGBoost for Spark.
RUN apt install -y procps libgomp1

# Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniforge3
ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python
ENV PATH=${CONDA_HOME}/bin:${PATH}
ADD https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh .
RUN bash Miniforge3-Linux-x86_64.sh -b -p /opt/miniforge3 \
  && ${CONDA_HOME}/bin/conda config --system --set always_yes True \
  && ${CONDA_HOME}/bin/conda config --system --set auto_update_conda False \
  && ${CONDA_HOME}/bin/conda config --system --set channel_priority strict
# Packages ipython and ipykernel are required if using custom conda and want to
# use this container for running notebooks.
RUN ${CONDA_HOME}/bin/mamba install ipython ipykernel

#Install Google Cloud SDK.
RUN ${CONDA_HOME}/bin/mamba install -n base google-cloud-sdk

# Install Conda packages.
#
# The following packages are installed in the default image.
# Recommendation: include all packages.
#
# Use mamba to quickly install packages.
RUN ${CONDA_HOME}/bin/mamba install -n base \
    accelerate \
    bigframes \
    cython \
    deepspeed \
    evaluate \
    fastavro \
    fastparquet \
    gcsfs \
    google-cloud-aiplatform \
    google-cloud-bigquery-storage \
    google-cloud-bigquery[pandas] \
    google-cloud-bigtable \
    google-cloud-container \
    google-cloud-datacatalog \
    google-cloud-dataproc \
    google-cloud-datastore \
    google-cloud-language \
    google-cloud-logging \
    google-cloud-monitoring \
    google-cloud-pubsub \
    google-cloud-redis \
    google-cloud-spanner \
    google-cloud-speech \
    google-cloud-storage \
    google-cloud-texttospeech \
    google-cloud-translate \
    google-cloud-vision \
    langchain \
    lightgbm \
    koalas \
    matplotlib \
    mlflow \
    nltk \
    numba \
    numpy \
    openblas \
    orc \
    pandas \
    pyarrow \
    pynvml \
    pysal \
    pytables \
    python \
    pytorch-cpu \
    regex \
    requests \
    rtree \
    scikit-image \
    scikit-learn \
    scipy \
    seaborn \
    sentence-transformers \
    sqlalchemy \
    sympy \
    tokenizers \
    transformers \
    virtualenv \
    xgboost

# Install pip packages.
RUN ${PYSPARK_PYTHON} -m pip install \
    spark-tensorflow-distributor \
    torcheval

# Install R and R libraries.
RUN ${CONDA_HOME}/bin/mamba install -n base \ 
    r-askpass \
    r-assertthat \
    r-backports \
    r-bit \
    r-bit64 \
    r-blob \
    r-boot \
    r-brew \
    r-broom \
    r-callr \
    r-caret \
    r-cellranger \
    r-chron \
    r-class \
    r-cli \
    r-clipr \
    r-cluster \
    r-codetools \
    r-colorspace \
    r-commonmark \
    r-cpp11 \
    r-crayon \
    r-curl \
    r-data.table \
    r-dbi \
    r-dbplyr \
    r-desc \
    r-devtools \
    r-digest \
    r-dplyr \
    r-ellipsis \
    r-evaluate \
    r-fansi \
    r-fastmap \
    r-forcats \
    r-foreach \
    r-foreign \
    r-fs \
    r-future \
    r-generics \
    r-ggplot2 \
    r-gh \
    r-glmnet \
    r-globals \
    r-glue \
    r-gower \
    r-gtable \
    r-haven \
    r-highr \
    r-hms \
    r-htmltools \
    r-htmlwidgets \
    r-httpuv \
    r-httr \
    r-hwriter \
    r-ini \
    r-ipred \
    r-isoband \
    r-iterators \
    r-jsonlite \
    r-kernsmooth \
    r-knitr \
    r-labeling \
    r-later \
    r-lattice \
    r-lava \
    r-lifecycle \
    r-listenv \
    r-lubridate \
    r-magrittr \
    r-markdown \
    r-mass \
    r-matrix \
    r-memoise \
    r-mgcv \
    r-mime \
    r-modelmetrics \
    r-modelr \
    r-munsell \
    r-nlme \
    r-nnet \
    r-numderiv \
    r-openssl \
    r-pillar \
    r-pkgbuild \
    r-pkgconfig \
    r-pkgload \
    r-plogr \
    r-plyr \
    r-praise \
    r-prettyunits \
    r-processx \
    r-prodlim \
    r-progress \
    r-promises \
    r-proto \
    r-ps \
    r-purrr \
    r-r6 \
    r-randomforest \
    r-rappdirs \
    r-rcmdcheck \
    r-rcolorbrewer \
    r-rcpp \
    r-rcurl \
    r-readr \
    r-readxl \
    r-recipes \
    r-recommended \
    r-rematch \
    r-remotes \
    r-reprex \
    r-reshape2 \
    r-rlang \
    r-rmarkdown \
    r-rodbc \
    r-roxygen2 \
    r-rpart \
    r-rprojroot \
    r-rserve \
    r-rsqlite \
    r-rstudioapi \
    r-rvest \
    r-scales \
    r-selectr \
    r-sessioninfo \
    r-shape \
    r-shiny \
    r-sourcetools \
    r-spatial \
    r-squarem \
    r-stringi \
    r-stringr \
    r-survival \
    r-sys \
    r-teachingdemos \
    r-testthat \
    r-tibble \
    r-tidyr \
    r-tidyselect \
    r-tidyverse \
    r-timedate \
    r-tinytex \
    r-usethis \
    r-utf8 \
    r-uuid \
    r-vctrs \
    r-whisker \
    r-withr \
    r-xfun \
    r-xml2 \
    r-xopen \
    r-xtable \
    r-yaml \
    r-zip

ENV R_HOME=/usr/lib/R

# Add extra Python modules.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"

# Add extra jars.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}"

#Uncomment below and replace EXTRA_JAR_NAME with the jar file name.
#COPY "EXTRA_JAR_NAME" "${SPARK_EXTRA_JARS_DIR}"

# Create the 'spark' group/user.
# The GID and UID must be 1099. Home directory is required.
RUN groupadd -g 1099 spark
RUN useradd -u 1099 -g 1099 -d /home/spark -m spark
USER spark
      

Perintah build

Jalankan perintah berikut di direktori Dockerfile untuk membangun dan mengirim image kustom ke Artifact Registry.

# Build and push the image.
gcloud builds submit --region=REGION \
    --tag REGION-docker.pkg.dev/PROJECT/REPOSITORY/IMAGE_NAME:IMAGE_VERSION