Managed Service untuk Apache Spark serverless menjalankan workload dalam container Docker. Container menyediakan lingkungan runtime untuk proses driver dan executor workload. Secara default, Managed Service untuk Apache Spark menggunakan image container yang mencakup 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 beban kerja Spark yang tidak disediakan oleh image container default. Penting: Jangan sertakan Spark dalam image container kustom Anda; Managed Service untuk Apache Spark akan mem-mount Spark ke dalam penampung 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:
- Image kustom: 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 beban kerja pengguna yang disertakan dalam image container kustom Anda atau 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 dengan menambahkan "--" di 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 beban kerja 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: wilayah
- 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 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.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 container
Managed Service untuk Apache Spark menjalankan container sebagai pengguna Linux spark dengan
1099 UID dan 1099 GID. Direktif USER yang ditetapkan di 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 gambar sebagai dependensi beban kerja, Anda harus memberikan izin baca
kepada pengguna spark untuk file tersebut.
Image streaming
Managed Service untuk Apache Spark biasanya memulai beban kerja yang memerlukan image container kustom dengan mendownload seluruh image ke disk. Hal ini dapat menyebabkan penundaan waktu inisialisasi, terutama bagi pelanggan yang memiliki 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 workload Managed Service untuk Apache Spark 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 gambar:
- Gambar dengan lapisan kosong atau lapisan duplikat
- Image yang menggunakan Manifes Image V2, skema versi 1
Dalam kasus ini, Managed Service untuk Apache Spark menarik seluruh gambar 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) di 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. Pada waktu proses, 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 di image container kustom, dan Anda dapat menyetel variabel lingkungan SPARK_EXTRA_CLASSPATH untuk menyertakan jar. Managed Service untuk Apache Spark akan menambahkan nilai variabel env
di classpath proses JVM Spark. 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, lalu merujuknya 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, 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 lain 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
menunjuk 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 pembuatan image container kustom, yang mencakup contoh Dockerfiles, diikuti dengan perintah build. Salah satu contoh mencakup konfigurasi minimum yang diperlukan untuk membuat gambar. Contoh lainnya mencakup contoh konfigurasi tambahan, termasuk library Python dan R.
Rekomendasi penempatan bersama arsitektur
Untuk memastikan inisialisasi container yang cepat menggunakan Google Cloud Image streaming (Container File System API) dan untuk mencegah biaya pergerakan data lintas region, semua layanan berikut harus berada di region yang sama:
- Artifact Registry
- Bucket Cloud Storage
- Beban kerja batch Managed Service untuk Apache Spark
Langkah 1: Konfigurasi lingkungan
Buka terminal atau Google Cloud Shell 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
# 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 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 gambar, 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 gambar dihosting di project yang berbeda dengan tempat workload berjalan.- Untuk versi runtime yang lebih lama dari
3.0, berikan izin ini ke akun layanan layanan eksekusi sesi atau beban kerja.- Untuk versi runtime
3.0dan yang lebih baru, berikan izin ini ke akun layanan Dataproc Resource Manager Node Service Agent.
- Untuk versi runtime
- Untuk versi runtime yang lebih lama dari
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