Menggunakan container kustom dengan Google Cloud Serverless untuk Apache Spark

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

Mengirimkan workload batch Spark menggunakan image container kustom

gcloud

Gunakan perintah gcloud dataproc batches submit spark dengan flag --container-image untuk menentukan image container kustom saat Anda mengirimkan 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. (Google Cloud Serverless untuk Apache Spark tidak dapat mengambil container dari registry lain).
  • --jars: Tentukan jalur ke beban kerja pengguna yang disertakan dalam image penampung kustom Anda atau 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 flag 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 "--" di akhir perintah, diikuti dengan argumen workload.

REST

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

Contoh berikut menunjukkan cara menggunakan container kustom untuk mengirimkan beban kerja batch menggunakan Google Cloud Serverless for 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 . (Google Cloud Serverless untuk Apache Spark tidak dapat mengambil container dari registry lain).
  • jar-uri: Tentukan jalur ke jar beban kerja yang disertakan dalam image container kustom Anda atau berada di Cloud Storage, misalnya, "/opt/spark/jars/spark-examples.jar" atau "gs:///spark/jars/spark-examples.jar".
  • class: Nama class yang sepenuhnya memenuhi syarat dalam file jar, seperti "org.apache.spark.examples.SparkPi".
  • Opsi lain: Anda dapat menggunakan kolom resource workload batch lainnya, misalnya, menggunakan kolom sparkBatch.args untuk meneruskan argumen ke workload Anda (lihat dokumentasi resource Batch untuk mengetahui informasi selengkapnya). Untuk menggunakan 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

Google Cloud Image container kustom Serverless for 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 Google Cloud Serverless 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

Google Cloud Serverless for Apache Spark menjalankan container sebagai pengguna Linux spark dengan 1099 UID dan 1099 GID. Direktif USER yang ditetapkan dalam Dockerfile image container kustom 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 beban kerja, Anda harus memberikan izin baca kepada pengguna spark untuk file tersebut.

Streaming gambar

Serverless for 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 yang menggunakan gambar berukuran besar.

Sebagai gantinya, Anda dapat menggunakan streaming gambar, yang merupakan metode untuk menarik data gambar sesuai kebutuhan. Hal ini memungkinkan workload dimulai tanpa menunggu seluruh image didownload, sehingga berpotensi meningkatkan waktu inisialisasi. Untuk mengaktifkan streaming gambar, 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 beban kerja Dataproc Anda atau di multi-region yang sesuai dengan region tempat beban kerja Anda berjalan. Jika Dataproc tidak mendukung image atau layanan streaming image tidak tersedia, penerapan streaming kami akan mendownload seluruh image.

Perhatikan bahwa kami tidak mendukung hal berikut untuk streaming gambar:

Dalam kasus ini, Dataproc menarik seluruh image sebelum memulai beban kerja.

Spark

Jangan sertakan Spark dalam image container kustom Anda. Saat runtime, Google Cloud Serverless for 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 Google Cloud Serverless untuk Apache Spark saat runtime.

Java Runtime Environment

Jangan sertakan Java Runtime Environment (JRE) Anda sendiri dalam image container kustom. Pada waktu proses, Google Cloud Serverless untuk Apache Spark memasang OpenJDK dari host ke dalam container. Jika Anda menyertakan JRE dalam image container kustom, JRE tersebut akan diabaikan.

Paket Java

Anda dapat menyertakan file jar sebagai dependensi beban kerja Spark dalam image container kustom, dan Anda dapat menetapkan variabel lingkungan SPARK_EXTRA_CLASSPATH untuk menyertakan jar. Google Cloud Serverless for Apache Spark akan menambahkan nilai variabel lingkungan di classpath proses JVM Spark. Rekomendasi: tempatkan JAR di direktori /opt/spark/jars dan tetapkan SPARK_EXTRA_CLASSPATH ke /opt/spark/jars/*.

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

Paket Python

Secara default, Google Cloud Serverless for Apache Spark memasang build lingkungan Conda menggunakan repo OSS Conda-Forge dari host ke direktori /opt/dataproc/conda dalam container saat runtime. PYSPARK_PYTHON disetel ke /opt/dataproc/conda/bin/python. Direktori dasarnya, /opt/dataproc/conda/bin, disertakan dalam PATH.

Anda dapat menyertakan lingkungan Python dengan paket di direktori yang berbeda dalam image container kustom, misalnya di /opt/conda, dan menetapkan variabel lingkungan PYSPARK_PYTHON 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 di image container kustom 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 pembuatan image container kustom

Bagian ini mencakup contoh build image container kustom, yang mencakup contoh Dockerfiles, diikuti dengan perintah build. Satu contoh mencakup konfigurasi minimum yang diperlukan untuk membuat image. Contoh lainnya mencakup 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 jemalloc2 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 jemalloc2 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 mem-build 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