Managed Service untuk Apache Spark serverless 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. API batch Managed Service untuk Apache Spark 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 flag --container-image untuk menentukan image container kustom Anda
saat 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 (GAR). (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.jarataugs://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 workload: Anda dapat menambahkan argumen workload apa pun dengan menambahkan "--" ke akhir perintah, diikuti dengan argumen workload.
REST
Image container kustom disediakan melalui kolom RuntimeConfig.containerImage sebagai bagian dari permintaan API batches.create.
Contoh berikut menunjukkan cara menggunakan container kustom untuk mengirimkan workload batch menggunakan API batches.create Managed Service untuk Apache Spark.
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 class yang sepenuhnya memenuhi syarat dalam file jar, seperti "org.apache.spark.examples.SparkPi".- Opsi lainnya: Anda dapat menggunakan kolom resource workload batch lainnya, misalnya,
gunakan kolom
sparkBatch.argsuntuk meneruskan argumen ke workload Anda (lihat dokumentasi resourceBatchuntuk 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
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:
procpstini
Untuk menjalankan XGBoost dari Spark (Java atau Scala), Anda harus menyertakan libgomp1
Pengguna penampung
Managed Service untuk Apache Spark menjalankan container sebagai pengguna Linux spark dengan UID 1099 dan GID 1099. Perintah 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 workload, Anda harus memberi pengguna spark izin
baca ke file tersebut.
Image streaming
Managed Service untuk Apache Spark biasanya memulai workload yang memerlukan image container kustom dengan mendownload seluruh image ke disk. Hal ini dapat berarti penundaan dalam waktu inisialisasi, terutama bagi pelanggan dengan image besar.
Sebagai gantinya, Anda dapat menggunakan streaming image, yang merupakan metode untuk mengambil data image sesuai kebutuhan. Hal ini memungkinkan workload dimulai tanpa menunggu seluruh image didownload, sehingga berpotensi meningkatkan waktu inisialisasi. Untuk mengaktifkan streaming image, 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 workload Managed Service untuk 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 streaming image tidak tersedia, implementasi streaming kami akan mendownload seluruh image.
Perhatikan bahwa kami tidak mendukung hal berikut untuk streaming image:
- Gambar dengan lapisan kosong atau lapisan duplikat
- Image yang menggunakan Manifes Image V2, skema versi 1
Dalam kasus ini, Managed Service untuk Apache Spark mengambil seluruh image sebelum memulai workload.
Persyaratan tambahan
Jika Kontrol Layanan VPC melindungi image container dan Anda menggunakan streaming Image, Anda juga harus menyertakan Image streaming API (
containerfilesystem.googleapis.com) di perimeter layanan.Jika workload Spark tidak menggunakan akun layanan default, Anda harus memastikan bahwa akun layanan kustom Anda memiliki peran IAM Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) dalam project yang menghosting image container.
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. Saat runtime, Managed Service 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 workload Spark dalam image container kustom, dan Anda dapat menetapkan variabel env SPARK_EXTRA_CLASSPATH untuk menyertakan jar. Managed Service untuk Apache Spark akan menambahkan nilai variabel env
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 sebagai contoh).
Paket Python
Secara default, Managed Service untuk Apache Spark memasang build lingkungan Conda menggunakan repo OSS Conda-Forge dari host ke direktori /opt/managed-spark/conda dalam container saat runtime.
PYSPARK_PYTHON disetel ke /opt/managed-spark/conda/bin/python. Direktori dasarnya, /opt/managed-spark/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 agar 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 ditetapkan secara otomatis berdasarkan variabel lingkungan PYSPARK_PYTHON.
Contoh build image container kustom
Bagian ini mencakup contoh build image container kustom, yang mencakup contoh Dockerfiles, diikuti dengan perintah build. Satu contoh menyertakan konfigurasi minimum yang diperlukan untuk membangun image. Contoh lainnya mencakup contoh konfigurasi tambahan, termasuk library Python dan R.
Rekomendasi kolokasi arsitektur
Untuk memastikan inisialisasi container yang cepat menggunakan Google Cloud Image streaming (Container sistem file API) dan untuk mencegah biaya pemindahan data lintas region, layanan berikut harus berada di region yang sama:
- Artifact Registry
- Bucket Cloud Storage
- Workload batch Managed Service untuk Apache Spark
Langkah 1: Konfigurasi lingkungan
Buka terminal atau Google Cloud Shell Anda dan siapkan variabel lingkungan berikut untuk menyederhanakan proses deployment.
export PROJECT_ID="YOUR_PROJECT_ID"
export REGION="us-east1"
export REPO_NAME="spark-images"
export BUCKET_NAME="spark-jobs-bucket-${PROJECT_ID}-${REGION}"
Langkah 2: Konfigurasi Dockerfile
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 jupyter
# 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
Langkah 3: Perintah build & push
Jalankan perintah ini untuk membangun dan mengupload image container Anda ke Artifact Registry menggunakan Cloud Build.
Buat bucket Cloud Storage:
gcloud storage buckets create gs://${BUCKET_NAME} --project=${PROJECT_ID} \ --location=${REGION}Buat repositori Artifact Registry:
gcloud artifacts repositories create ${REPO_NAME} \ --repository-format=docker --location=${REGION} --description="Custom Dataproc Serverless images"Bangun dan kirim image menggunakan Cloud Build:
gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/spark-custom:latest .
Langkah 4: Pengiriman tugas
Deploy tugas dengan menentukan runtime --version=2.3 untuk menghindari masalah penyimpangan versi. Di lingkungan produksi, memberikan versi image, bukan tag :latest, adalah praktik terbaik.
- Izin: Pastikan akun layanan yang sesuai memiliki peran **
Artifact Registry Reader**
(
roles/artifactregistry.reader) di repositori Artifact Registry (direkomendasikan) atau project yang menghosting image container. Hal ini sangat penting jika image dihosting di project yang berbeda dengan tempat workload berjalan.- Untuk versi runtime sebelum
3.0, berikan izin ini ke akun layanan eksekusi workload atau sesi.- Untuk versi runtime
3.0dan yang lebih baru, berikan izin ini ke akun layanan Agen Layanan Node Dataproc Resource Manager.
- Untuk versi runtime
- Untuk versi runtime sebelum
gcloud dataproc batches submit pyspark \
file:///usr/lib/spark/examples/src/main/python/pi.py \
--region=${REGION} \
--project=${PROJECT_ID} \
--version=2.3 \
--container-image=${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/spark-custom:latest \
-- 10