Managed Service for Apache Spark serverless esegue i workload all'interno di container Docker. Il container fornisce l'ambiente di runtime per i processi del driver e dell'esecutore del workload. Per impostazione predefinita, Managed Service for Apache Spark utilizza un'immagine container che include i pacchetti Spark, Java, Python e R predefiniti associati a una versione di rilascio del runtime. L'API Managed Service for Apache Spark batches ti consente di utilizzare un'immagine container personalizzata anziché quella predefinita. In genere, un'immagine container personalizzata aggiunge dipendenze Java o Python del carico di lavoro Spark non fornite dall'immagine container predefinita. Importante:non includere Spark nell'immagine container personalizzata. Managed Service for Apache Spark monterà Spark nel container in fase di runtime.
Invia un carico di lavoro batch Spark utilizzando un'immagine container personalizzata
gcloud
Utilizza il comando
gcloud dataproc batches submit spark
con il flag --container-image per specificare l'immagine container personalizzata
quando invii un carico di lavoro 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
Note:
- Custom-image:specifica l'immagine container personalizzata utilizzando il seguente formato di denominazione delle immagini Container Registry:
{hostname}/{project-id}/{image}:{tag}, ad esempio "gcr.io/my-project-id/my-image:1.0.1". Nota:devi ospitare l'immagine container personalizzata su Container Registry o Artifact Registry (GAR). Managed Service for Apache Spark non può recuperare i container da altri registri. --jars: specifica un percorso a un carico di lavoro utente incluso nell'immagine container personalizzata o in Cloud Storage, ad esempiofile:///opt/spark/jars/spark-examples.jarogs://my-bucket/spark/jars/spark-examples.jar.- Altre opzioni del comando batch: puoi aggiungere altri flag di comando batch facoltativi, ad esempio, per utilizzare un server di cronologia permanente (PHS). Nota: il PHS deve trovarsi nella regione in cui esegui i carichi di lavoro batch.
- Argomenti del carico di lavoro:puoi aggiungere qualsiasi argomento del carico di lavoro aggiungendo "--" alla fine del comando, seguito dagli argomenti del carico di lavoro.
REST
L'immagine container personalizzata viene fornita tramite il campo RuntimeConfig.containerImage nell'ambito di una richiesta API batches.create.
L'esempio seguente mostra come utilizzare un container personalizzato per inviare un workload batch utilizzando l'API Managed Service for Apache Spark batches.create.
Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:
- project-id: ID progetto Google Cloud
- region: region
- custom-container-image: specifica l'immagine container personalizzata utilizzando il
seguente formato di denominazione delle immagini di Container Registry:
{hostname}/{project-id}/{image}:{tag}, ad esempio "gcr.io/my-project-id/my-image:1.0.1". Nota: devi ospitare il container personalizzato su Container Registry o Artifact Registry . Managed Service for Apache Spark non può recuperare i container da altri registri. jar-uri: Specifica un percorso a un file JAR del carico di lavoro incluso nell'immagine container personalizzata o in Cloud Storage, ad esempio, "/opt/spark/jars/spark-examples.jar" o "gs:///spark/jars/spark-examples.jar".class: il nome completo di una classe nel file JAR, ad esempio "org.apache.spark.examples.SparkPi".- Altre opzioni: puoi utilizzare altri campi delle risorse del carico di lavoro batch, ad esempio,
utilizza il campo
sparkBatch.argsper passare argomenti al tuo carico di lavoro (per maggiori informazioni, consulta la documentazione delle risorseBatch). Per utilizzare un server di cronologia permanente (PHS), consulta Configurazione di un server di cronologia permanente. Nota: il PHS deve trovarsi nella regione in cui esegui i carichi di lavoro batch.
Metodo HTTP e URL:
POST https://dataproc.googleapis.com/v1/projects/project-id/locations/region/batches
Corpo JSON della richiesta:
{
"runtimeConfig":{
"containerImage":"custom-container-image
},
"sparkBatch":{
"jarFileUris":[
"jar-uri"
],
"mainClass":"class"
}
}
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{
"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"
}
Crea un'immagine container personalizzata
Le immagini container personalizzate di Managed Service for Apache Spark sono immagini Docker. Puoi utilizzare gli strumenti per creare immagini Docker per creare immagini container personalizzate, ma le immagini devono soddisfare determinate condizioni per essere compatibili con Managed Service for Apache Spark. Le sezioni seguenti spiegano queste condizioni.
Sistema operativo
Puoi scegliere qualsiasi immagine di base del sistema operativo per l'immagine container personalizzata.
Consiglio: utilizza le immagini Debian 12 predefinite, ad esempio debian:12-slim,
in quanto sono state testate per evitare problemi di compatibilità.
Utilità
Devi includere i seguenti pacchetti di utilità, necessari per eseguire Spark, nella tua immagine container personalizzata:
procpstini
Per eseguire XGBoost da Spark (Java o Scala), devi includere libgomp1
Utente del container
Managed Service for Apache Spark esegue i container come utente Linux spark con un
UID 1099 e un GID 1099. Le direttive USER impostate nei Dockerfile delle immagini container personalizzate vengono ignorate in fase di runtime. Utilizza l'UID e il GID per le autorizzazioni del file system. Ad esempio, se aggiungi un file JAR in /opt/spark/jars/my-lib.jar
nell'immagine come dipendenza del workload, devi concedere all'utente spark l'autorizzazione
di lettura del file.
Flusso immagini
Managed Service for Apache Spark di solito inizia un workload che richiede un'immagine container personalizzata scaricando l'intera immagine sul disco. Ciò può comportare un ritardo nel tempo di inizializzazione, soprattutto per i clienti con immagini di grandi dimensioni.
In alternativa, puoi utilizzare lo streaming delle immagini, un metodo per estrarre i dati delle immagini in base alle necessità. In questo modo, il carico di lavoro può avviarsi senza attendere il download dell'intera immagine, migliorando potenzialmente il tempo di inizializzazione. Per attivare lo streaming delle immagini, devi abilitare l'API Container File System. Devi anche archiviare le immagini container in Artifact Registry e il repository Artifact Registry deve trovarsi nella stessa regione del carico di lavoro Managed Service for Apache Spark o in una multi-regione corrispondente alla regione in cui viene eseguito il carico di lavoro. Se Managed Service for Apache Spark non supporta l'immagine o il servizio di streaming delle immagini non è disponibile, la nostra implementazione di streaming scarica l'intera immagine.
Tieni presente che non supportiamo quanto segue per lo streaming di immagini:
- Immagini con livelli vuoti o duplicati
- Immagini che utilizzano Manifest V2 Image, schema versione 1
In questi casi, Managed Service for Apache Spark estrae l'intera immagine prima di avviare il workload.
Requisiti aggiuntivi
Se Controlli di servizio VPC protegge le tue immagini container e utilizzi lo streaming di immagini, devi includere anche l'API Image Streaming (
containerfilesystem.googleapis.com) nel perimetro di servizio.Se il workload Spark non utilizza il account di servizio predefinito, devi assicurarti che il account di servizio personalizzato disponga del ruolo IAM Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) nel progetto che ospita l'immagine container.
Spark
Non includere Spark nell'immagine container personalizzata. In fase di runtime,
Managed Service for Apache Spark monta i file binari e le configurazioni di Spark dall'host
nel container: i file binari vengono montati nella directory /usr/lib/spark e
le configurazioni vengono montate nella directory /etc/spark/conf. I file esistenti in queste
directory vengono sovrascritti da Managed Service for Apache Spark in fase di runtime.
Java Runtime Environment
Non includere il tuo Java Runtime Environment (JRE) nell'immagine container personalizzata. In fase di runtime, Managed Service for Apache Spark monta OpenJDK dall'host
nel container. Se includi una JRE nell'immagine container personalizzata, verrà
ignorata.
Pacchetti Java
Puoi includere file JAR come dipendenze del workload Spark nell'immagine container personalizzata e puoi impostare la variabile di ambiente SPARK_EXTRA_CLASSPATH in modo da includere i file JAR. Managed Service for Apache Spark aggiungerà il valore della variabile di ambiente
nel classpath dei processi JVM di Spark. Consiglio: inserisci i file JAR nella directory
/opt/spark/jars e imposta SPARK_EXTRA_CLASSPATH su
/opt/spark/jars/*.
Puoi includere il file JAR del workload nell'immagine container personalizzata, quindi farvi riferimento
con un percorso locale quando invii il workload, ad esempio
file:///opt/spark/jars/my-spark-job.jar (vedi Invia un workload batch Spark
utilizzando un'immagine container personalizzata per un esempio).
Pacchetti Python
Per impostazione predefinita, Managed Service for Apache Spark monta una build dell'ambiente Conda utilizzando
un repository OSS Conda-Forge dall'host alla
directory /opt/managed-spark/conda nel container in fase di runtime.
PYSPARK_PYTHON è impostato su /opt/managed-spark/conda/bin/python. La relativa directory
di base, /opt/managed-spark/conda/bin, è inclusa in PATH.
Puoi includere il tuo ambiente Python con i pacchetti in una directory diversa nell'immagine container personalizzata, ad esempio in /opt/conda, e impostare la variabile di ambiente PYSPARK_PYTHON su /opt/conda/bin/python.
L'immagine container personalizzata può includere altri moduli Python che non fanno parte
dell'ambiente Python, ad esempio script Python con funzioni di utilità.
Imposta la variabile di ambiente PYTHONPATH in modo che includa le directory in cui si trovano i moduli.
Ambiente R
Puoi personalizzare l'ambiente R nell'immagine container personalizzata utilizzando una delle seguenti opzioni:
- Utilizza Conda per gestire e installare i pacchetti R dal canale
conda-forge. - Aggiungi un repository R per il sistema operativo Linux dell'immagine container e installa i pacchetti R utilizzando il gestore di pacchetti del sistema operativo Linux (consulta l'indice dei pacchetti software R).
Quando utilizzi una delle due opzioni, devi impostare la variabile di ambiente R_HOME in modo che punti al tuo ambiente R personalizzato. Eccezione: se utilizzi Conda sia per gestire l'ambiente R sia per personalizzare l'ambiente Python, non devi impostare la variabile di ambiente R_HOME, che viene impostata automaticamente in base alla variabile di ambiente PYSPARK_PYTHON.
Esempio di creazione di un'immagine container personalizzata
Questa sezione include esempi di creazione di immagini container personalizzate, tra cui Dockerfiles di esempio, seguiti dai comandi di build. Un esempio include la configurazione minima richiesta per creare un'immagine. L'altro esempio include esempi di configurazione aggiuntiva, tra cui le librerie Python e R.
Suggerimento per la co-location dell'architettura
Per garantire l'inizializzazione rapida dei container utilizzando Google Cloud lo streaming di immagini (API Container File System) e per evitare costi di trasferimento dei dati tra regioni, i seguenti servizi devono trovarsi tutti nella stessa regione:
- Artifact Registry
- Bucket Cloud Storage
- Workload batch Managed Service for Apache Spark
Passaggio 1: configura l'ambiente
Apri il terminale o Google Cloud Shell e configura le seguenti variabili di ambiente per semplificare il processo di 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}"
Passaggio 2: configurazione di Dockerfile
Configurazione minima
# 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
Configurazione aggiuntiva
# 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
Passaggio 3: crea ed esegui i comandi
Esegui questi comandi per creare e caricare l'immagine container in Artifact Registry utilizzando Cloud Build.
Crea il bucket Cloud Storage:
gcloud storage buckets create gs://${BUCKET_NAME} --project=${PROJECT_ID} \ --location=${REGION}Crea il repository Artifact Registry:
gcloud artifacts repositories create ${REPO_NAME} \ --repository-format=docker --location=${REGION} --description="Custom Dataproc Serverless images"Crea ed esegui il push dell'immagine utilizzando Cloud Build:
gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/spark-custom:latest .
Passaggio 4: invio del job
Esegui il deployment del job definendo il runtime --version=2.3 per evitare problemi di deriva della versione. Negli ambienti di produzione, fornire la versione dell'immagine anziché il tag
:latest è una best practice.
- Autorizzazioni:assicurati che il account di servizio appropriato disponga del ruolo **Lettore di Artifact Registry** (
roles/artifactregistry.reader) nel repository Artifact Registry (consigliato) o nel progetto che ospita l'immagine container. Ciò è particolarmente importante se l'immagine è ospitata in un progetto diverso da quello in cui viene eseguito il workload.- Per le versioni di runtime precedenti a
3.0, concedi questa autorizzazione al service account di esecuzione del carico di lavoro o della sessione.- Per le versioni di runtime
3.0e successive, concedi questa autorizzazione al service account dell'agente di servizio del nodo di Dataproc Resource Manager.
- Per le versioni di runtime
- Per le versioni di runtime precedenti a
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