Usa container personalizzati con Dataproc Serverless per Spark

Dataproc Serverless per Spark esegue i carichi di lavoro all'interno dei container Docker. Il container fornisce l'ambiente di runtime per il driver del carico di lavoro e i processi esecutori. Per impostazione predefinita, Dataproc Serverless per Spark utilizza che include i pacchetti Spark, Java, Python e R predefiniti associate a una versione di release runtime. Dataproc Serverless per Spark batch L'API consente di utilizzare un'immagine container personalizzata anziché quella predefinita dell'immagine. In genere, un'immagine container personalizzata aggiunge Java o Python per il carico di lavoro Spark le dipendenze non fornite dall'immagine container predefinita. Importante: non includi Spark nell'immagine container personalizzata; Dataproc Serverless per Spark monta Spark nel container in fase di runtime.

Invia un carico di lavoro batch Spark utilizzando un'immagine container personalizzata

gcloud

Utilizza la gcloud dataproc batches send spark con il flag --container-image per specificare la tua 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:

  • Immagine personalizzata: specifica l'immagine container personalizzata utilizzando il metodo 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: l'immagine container personalizzata deve essere ospitata su Container Registry o Artifact Registry. (Dataproc Serverless non può recuperare i container da altri registri).
  • --jars: specifica il percorso di una 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 batch:puoi aggiungere altri batch facoltativi. come flag di comando, ad esempio per utilizzare un server di cronologia permanente (PHS). Nota: il PHS deve trovarsi nella regione in cui vengono eseguiti i carichi di lavoro batch.
  • Argomenti del carico di lavoroPuoi aggiungere qualsiasi argomento del carico di lavoro aggiungendo un segno "--" a alla fine del comando, seguiti dagli argomenti del carico di lavoro.

REST

L'immagine container personalizzata viene fornita tramite RuntimeConfig.containerImage nell'ambito di un batches.create richiesta API.

L'esempio seguente mostra come utilizzare un container personalizzato Inviare un carico di lavoro batch utilizzando Dataproc Serverless per Spark API batches.create.

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

  • project-id: ID progetto Google Cloud
  • region: regione
  • custom-container-image: specifica l'immagine del container personalizzato utilizzando il metodo 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 . (Dataproc Serverless non può recuperare i container da altri registri).
  • jar-uri: Specifica un percorso di 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: nome completo di una classe nel file jar, ad esempio "org.apache.spark.examples.SparkPi".
  • Altre opzioni:puoi utilizzare altri campi delle risorse per il carico di lavoro batch, ad esempio utilizza sparkBatch.args per passare argomenti al carico di lavoro (vedi il Batch documentazione delle risorse per ulteriori informazioni). Per utilizzare un PHS (Persistent History Server), consulta la sezione Configurazione di un server di cronologia permanente. Nota: il PHS deve trovarsi nella regione in cui vengono eseguiti 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 delle seguenti 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 Dataproc Serverless per Spark sono immagini Docker. Puoi utilizzare gli strumenti per la creazione di immagini Docker al fine di creare immagini container personalizzate, ma condizioni che le immagini devono soddisfare per essere compatibile con Dataproc Serverless per Spark. Queste condizioni sono descritte nelle sezioni seguenti.

Sistema operativo

Puoi scegliere qualsiasi immagine del sistema operativo come immagine di base dell'immagine container personalizzata. Consiglio: sono preferite le immagini Debian 11 predefinite (ad esempio, debian:11-slim) perché hanno ricevuto test per evitare problemi di compatibilità.

Utilità

Devi includere i seguenti pacchetti di utilità, che sono obbligatori per eseguire Spark, nell'immagine container personalizzata:

  • procps
  • tini

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

Utente contenitore

Dataproc Serverless per Spark esegue container come utente Linux spark con un UID 1099 e un GID 1099. Istruzioni USER impostate nei Dockerfile di immagini container personalizzate vengono ignorati durante il runtime. Utilizza l'UID e il GID per le autorizzazioni del file system. Ad esempio, se aggiungi un file jar nel punto /opt/spark/jars/my-lib.jar dell'immagine come dipendenza dal carico di lavoro, devi concedere all'utente spark l'autorizzazione di lettura .

Flusso immagine

Dataproc Serverless per Spark normalmente avvia un carico di lavoro che richiede un'immagine container personalizzata scaricando l'intera immagine su disco. Ciò può significare un ritardo nell'inizializzazione soprattutto per i clienti con immagini di grandi dimensioni.

Puoi invece utilizzare il flusso di immagini, che è un metodo per eseguire il pull dei dati immagine su un in base alle necessità. In questo modo il carico di lavoro si avvia senza attendere l'intero l'immagine da scaricare, migliorando potenzialmente i tempi di inizializzazione. Per attivare l'immagine devi attivare API Container File System. Devi inoltre archiviare le immagini container in Artifact Registry e Artifact Registry il repository deve trovarsi nella stessa regione del carico di lavoro Dataproc o in una che corrisponde alla regione in cui è in esecuzione il carico di lavoro. Se Dataproc non supporta l'immagine o il flusso di immagini non è disponibile, la nostra implementazione di flussi di dati scarica l'intero dell'immagine. Tieni presente che non supportiamo quanto segue per lo streaming di immagini:

In questi casi, Dataproc esegue il pull dell'intera immagine prima di avviare il carico di lavoro.

Spark

Non includere Spark nell'immagine container personalizzata. Dataproc Serverless per Spark in fase di runtime monta i file binari e le configurazioni di Spark dall'host nel container: file binari vengono montate nella directory /usr/lib/spark e le configurazioni vengono montate Directory /etc/spark/conf. I file esistenti in queste directory vengono sostituiti da Dataproc Serverless per Spark in fase di runtime.

Java Runtime Environment

Non includere il tuo Java Runtime Environment (JRE) nell'immagine container personalizzata. In fase di esecuzione, Dataproc Serverless per Spark monta OpenJDK dall'host containerizzato. Se includi un JRE nell'immagine container personalizzata, verrà ignorato.

Pacchetti Java

Puoi includere file jar come dipendenze dei carichi di lavoro Spark nell'immagine container personalizzata imposta la variabile env SPARK_EXTRA_CLASSPATH per includere i jar. Dataproc Serverless per Spark aggiungi il valore della variabile env nel classpath dei processi JVM Spark. Suggerimento: metti i jar nella directory /opt/spark/jars e imposta SPARK_EXTRA_CLASSPATH a /opt/spark/jars/*.

Puoi includere il jar del carico di lavoro nell'immagine container personalizzata e farvi riferimento con un percorso locale durante l'invio del carico di lavoro, ad esempio file:///opt/spark/jars/my-spark-job.jar. (vedi Inviare un carico di lavoro batch Spark utilizzando un'immagine container personalizzata per un esempio).

Pacchetti Python

Per impostazione predefinita, Dataproc Serverless per Spark monta Conda dall'host a nella directory /opt/dataproc/conda nel container in fase di runtime. PYSPARK_PYTHON impostata su /opt/dataproc/conda/bin/python. La sua directory di base, /opt/dataproc/conda/bin, è incluso in PATH.

Puoi includere il tuo ambiente Python con pacchetti in una directory diversa nell'immagine container personalizzato, ad esempio in /opt/conda, e imposta la PYSPARK_PYTHON variabile di ambiente /opt/conda/bin/python.

L'immagine del container personalizzato può includere altri moduli Python che non fanno parte dell'ambiente Python, ad esempio gli script Python con funzioni di utilità. Imposta la variabile di ambiente PYTHONPATH per includere le directory in cui in cui si trovano i moduli.

Ambiente R

Puoi personalizzare l'ambiente R nella tua immagine container personalizzata utilizzando una delle seguenti opzioni:

  • Utilizza Conda per gestire e installare pacchetti R dal canale conda-forge.
  • Aggiungi un repository R per l'immagine container del sistema operativo Linux e installa i pacchetti R utilizzando il gestore di pacchetti del sistema operativo Linux (vedi Indice pacchetto R Software).

Quando utilizzi entrambe le opzioni, devi impostare la variabile di ambiente R_HOME in modo che punti al tuo ambiente R personalizzato. Eccezione: se utilizzi Conda per gestire l'ambiente R e personalizzare il tuo ambiente Python, non devi impostare la variabile di ambiente R_HOME. viene eseguito automaticamente impostato in base alla variabile di ambiente PYSPARK_PYTHON.

Esempio di creazione di immagini container personalizzate

Questa sezione include un esempio di build di un'immagine container personalizzata, a partire da con un Dockerfile di esempio.

Dockerfile

# Debian 11 is recommended.
FROM debian:11-slim

# Suppress interactive prompts
ENV DEBIAN_FRONTEND=noninteractive

# (Required) Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini libjemalloc2

# (Optiona) Install utilities required by XGBoost for Spark.
RUN apt install -y procps libgomp1

# Enable jemalloc2 as default memory allocator
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2

# (Optional) 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}"
COPY spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# (Optional) Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniconda3
ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python
ENV PATH=${CONDA_HOME}/bin:${PATH}
COPY Miniconda3-py39_4.10.3-Linux-x86_64.sh .
RUN bash Miniconda3-py39_4.10.3-Linux-x86_64.sh -b -p /opt/miniconda3 \
  && ${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 --prepend channels conda-forge \
  && ${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/conda install ipython ipykernel

# (Optional) Install Conda packages.
#
# The following packages are installed in the default image, it is strongly
# recommended to include all of them.
#
# Use mamba to install packages quickly.
RUN ${CONDA_HOME}/bin/conda install mamba -n base -c conda-forge \
    && ${CONDA_HOME}/bin/mamba install \
      conda \
      cython \
      fastavro \
      fastparquet \
      gcsfs \
      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 \
      koalas \
      matplotlib \
      nltk \
      numba \
      numpy \
      openblas \
      orc \
      pandas \
      pyarrow \
      pysal \
      pytables \
      python \
      regex \
      requests \
      rtree \
      scikit-image \
      scikit-learn \
      scipy \
      seaborn \
      sqlalchemy \
      sympy \
      virtualenv

# (Optional) Add extra Python modules.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# (Optional) Install R and R libraries.
RUN apt update \
  && apt install -y gnupg \
  && apt-key adv --no-tty \
      --keyserver "hkp://keyserver.ubuntu.com:80" \
      --recv-keys E19F5F87128899B192B1A2C2AD5F960A256A04AF \
  && echo "deb http://cloud.r-project.org/bin/linux/debian bullseye-cran40/" \
      >/etc/apt/sources.list.d/cran-r.list \
  && apt update \
  && apt install -y \
      libopenblas-base \
      libssl-dev \
      r-base \
      r-base-dev \
      r-recommended \
      r-cran-blob

ENV R_HOME=/usr/lib/R

# (Required) 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

Comandi di Build

Esegui nella directory Dockerfile.

IMAGE=gcr.io/my-project/my-image:1.0.1

# Download the BigQuery connector.
gsutil cp \
  gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .

# Download the Miniconda3 installer.
wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh

# Python module example
cat >test_util.py <<EOF
def hello(name):
  print("hello {}".format(name))

def read_lines(path):
  with open(path) as f:
    return f.readlines()
EOF

# Build and push the image.
docker build -t "${IMAGE}" .
docker push "${IMAGE}"