Utilizzo di container personalizzati

Managed Service per Apache Spark esegue i carichi di lavoro all'interno dei container Docker. Il container fornisce l'ambiente di runtime per i processi del driver e dell'executor del carico di lavoro. Per impostazione predefinita, Managed Service per 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 batch di Managed Service per Apache Spark ti consente di utilizzare un'immagine container personalizzata anziché quella predefinita. In genere, un'immagine container personalizzata aggiunge le 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 per 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 di 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. (Managed Service per 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 che si trova in Cloud Storage, ad esempio file:///opt/spark/jars/spark-examples.jar o gs://my-bucket/spark/jars/spark-examples.jar.
  • Altre opzioni del comando batches: puoi aggiungere altri flag del comando batches facoltativi, ad esempio per utilizzare un server di cronologia permanente (PHS). Nota: il server di cronologia permanente deve trovarsi nella regione in cui esegui i carichi di lavoro batch.
  • Argomenti del carico di lavoroPuoi 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 RuntimeConfig.containerImage campo come parte di una batches.create richiesta API.

L'esempio seguente mostra come utilizzare un container personalizzato per inviare un carico di lavoro batch utilizzando l'API batches.create di Managed Service per Apache Spark.

Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

  • project-id: ID progetto Google Cloud
  • region: regione
  • 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 per Apache Spark non può recuperare i container da altri registri).
  • jar-uri: specifica un percorso a un jar del carico di lavoro incluso nell'immagine container personalizzata o che si trova 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.args per passare gli argomenti al carico di lavoro (per ulteriori informazioni, consulta la documentazione della risorsa Batch ). Per utilizzare un server di cronologia permanente (PHS), consulta Configurare un server di cronologia permanente. Nota: il server di cronologia permanente 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 per Apache Spark sono immagini Docker. Puoi utilizzare gli strumenti per la creazione di immagini Docker per creare immagini container personalizzate, ma esistono condizioni che le immagini devono soddisfare per essere compatibili con Managed Service per Apache Spark. Queste condizioni vengono spiegate nelle sezioni che seguono.

Sistema operativo

Puoi scegliere qualsiasi immagine di base del sistema operativo per l'immagine container personalizzata.

Consiglio: utilizza le immagini predefinite di Debian 12, ad esempio debian:12-slim, poiché sono state testate per evitare problemi di compatibilità.

Utilità

Nell'immagine container personalizzata devi includere i seguenti pacchetti di utilità, necessari per eseguire Spark:

  • procps
  • tini

Per eseguire XGBoost da Spark (Java o Scala), devi includere libgomp1.

Utente del container

Managed Service per 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 carico di lavoro, devi concedere all'utente spark l'autorizzazione di lettura per il file.

Flusso immagine

In genere, Managed Service per Apache Spark avvia un carico di lavoro 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 il flusso di immagini, un metodo per eseguire il pull dei dati delle immagini in base alle esigenze. In questo modo, il carico di lavoro può essere avviato senza attendere il download dell'intera immagine, migliorando potenzialmente il tempo di inizializzazione. Per attivare il flusso di 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 di Managed Service per Apache Spark o in una regione multiregionale che corrisponde alla regione in cui è in esecuzione il carico di lavoro. Se Managed Service per Apache Spark non supporta l'immagine o il servizio di flusso di immagini non è disponibile, la nostra implementazione di streaming scarica l'intera immagine.

Tieni presente che non supportiamo quanto segue per il flusso di immagini:

In questi casi, Managed Service per Apache Spark esegue il pull dell'intera immagine prima di avviare il carico di lavoro.

Spark

Non includere Spark nell'immagine container personalizzata. In fase di runtime, Managed Service per 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 nella directory /etc/spark/conf. I file esistenti in queste directory vengono sostituiti da Managed Service per 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 per Apache Spark monta OpenJDK dall'host nel container. Se includi un JRE nell'immagine container personalizzata, verrà ignorato.

Pacchetti Java

Puoi includere i file jar come dipendenze del carico di lavoro Spark nell'immagine container personalizzata e puoi impostare la variabile di ambiente SPARK_EXTRA_CLASSPATH per includere i jar. Managed Service per Apache Spark aggiungerà il valore della variabile di ambiente nel classpath dei processi JVM di Spark. Consiglio: inserisci i jar nella directory /opt/spark/jars e imposta SPARK_EXTRA_CLASSPATH su /opt/spark/jars/*.

Puoi includere il jar del carico di lavoro nell'immagine container personalizzata, quindi farvi riferimento con un percorso locale quando invii il carico di lavoro, ad esempio file:///opt/spark/jars/my-spark-job.jar (per un esempio, consulta Invia un carico di lavoro batch Spark utilizzando un'immagine container personalizzata).

Pacchetti Python

Per impostazione predefinita, Managed Service per Apache Spark monta la build dell'ambiente Conda utilizzando un repository Conda-Forge OSS dall'host a la directory /opt/dataproc/conda nel container in fase di runtime. PYSPARK_PYTHON è impostato su /opt/dataproc/conda/bin/python. La directory di base, /opt/dataproc/conda/bin, è inclusa in PATH.

Puoi includere l'ambiente Python con i pacchetti in una directory diversa nell'immagine container personalizzata, ad esempio in /opt/conda, e impostare la PYSPARK_PYTHON variabile di ambiente 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 per includere 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 all'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; 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, che includono Dockerfile di esempio, seguiti da un comando 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.

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
      

Comando di build

Esegui il comando seguente nella directory Dockerfile per creare ed eseguire il push dell'immagine personalizzata in Artifact Registry.

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