Immagini container personalizzate di Dataproc su GKE

Puoi specificare un'immagine container personalizzata da utilizzare con Dataproc su GKE. L'immagine del container personalizzato deve usare uno dei cluster Dataproc su GKE immagini Spark di base.

Utilizza un'immagine container personalizzata

Per utilizzare un'immagine contenitore personalizzata Dataproc su GKE, imposta spark.kubernetes.container.image property quando crei un cluster virtuale Dataproc su GKE o invii un job Spark al cluster.

  • Esempio di creazione del cluster gcloud CLI:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • Esempio di invio di un job con l'interfaccia a riga di comando gcloud:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

Requisiti e impostazioni delle immagini container personalizzate

Immagini di base

Puoi utilizzare gli strumenti docker per creare un docker personalizzato in base a una delle immagini Spark di base di Dataproc su GKE pubblicate.

Utente del contenitore

Dataproc su GKE esegue i container Spark come utente spark di Linux con un UID 1099 e un GID 1099. Utilizza UID e 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 per il file.

Componenti

  • Java: la variabile di ambiente JAVA_HOME indica la posizione dell'installazione di Java. Il valore predefinito corrente è /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, che può cambiare (consulta le note di rilascio di Dataproc per informazioni aggiornate).

    • Se personalizzi l'ambiente Java, assicurati che JAVA_HOME sia impostato sulla posizione corretta e PATH include il percorso dei file binari.
  • Python: Dataproc su GKE immagini Spark di base hai installato Miniconda3 su /opt/conda. CONDA_HOME punti a questo elemento località, ${CONDA_HOME}/bin è inclusa in PATH e PYSPARK_PYTHON è impostato su ${CONDA_HOME}/python.

    • Se personalizzi Conda, assicurati che CONDA_HOME punti alla La home directory di Conda ,${CONDA_HOME}/bin è inclusa in PATH, e PYSPARK_PYTHON impostato su ${CONDA_HOME}/python.

    • Puoi installare, rimuovere e aggiornare i pacchetti nell'ambiente di base predefinito, o creare un nuovo ambiente, ma è vivamente consigliato che l'ambiente includi tutti i pacchetti installati nell'ambiente di base dell'immagine container di base.

    • Se aggiungi moduli Python, ad esempio uno script Python con funzioni di utilità, all'immagine del container, includi le directory dei moduli in PYTHONPATH.

  • Spark: Spark è installato in /usr/lib/spark e SPARK_HOME fa riferimento a questa posizione. Non è possibile personalizzare Spark. Se viene modificato, l'immagine verrà rifiutata o non funzionerà correttamente.

    • Job: puoi personalizzare le dipendenze dei job Spark. SPARK_EXTRA_CLASSPATH definisce il classpath extra per i processi JVM Spark. Consiglio: metti i barattoli sotto /opt/spark/jars e impostare SPARK_EXTRA_CLASSPATH su /opt/spark/jars/*.

      Se incorpori il job jar nell'immagine, la directory consigliata è /opt/spark/job. Quando invii il job, puoi farvi riferimento con un percorso locale, ad esempio file:///opt/spark/job/my-spark-job.jar.

    • Connettore Cloud Storage: il connettore Cloud Storage è installato in /usr/lib/spark/jars.

    • Utilità: per eseguire i pacchetti di utilità procps e tini sono necessari Spark. Queste utilità sono incluse immagini Spark di base, quindi le immagini personalizzate non devono reinstallali.

    • Punto di ingresso: Dataproc su GKE ignora qualsiasi modifiche apportate alle primitive ENTRYPOINT e CMD nella nell'immagine container.

    • Script di inizializzazione:puoi aggiungere uno script di inizializzazione facoltativo alla pagina /opt/init-script.sh. Uno script di inizializzazione può scaricare file da Cloud Storage, avviare un proxy all'interno del container, richiamare altri script ed eseguire altre attività di machine learning.

      Lo script entrypoint chiama lo script di inizializzazione con tutti gli argomenti della riga di comando ($@) prima di avviare il driver Spark, l'executor Spark e altri processi. Lo script di inizializzazione puoi selezionare il tipo di processo Spark in base al primo argomento ($1): i valori possibili includono spark-submit per i container di driver e executor per i container esecutori.

  • Configurazioni: le configurazioni Spark si trovano in /etc/spark/conf. La variabile di ambiente SPARK_CONF_DIR punta a questa posizione.

    Non personalizzare le configurazioni Spark nell'immagine container. Invia invece le proprietà tramite l'API Dataproc su GKE per i seguenti motivi:

    • Alcune proprietà, come la dimensione della memoria dell'executor, vengono determinate in fase di esecuzione, non al momento della compilazione dell'immagine del contenitore. Devono essere iniettate da Dataproc su GKE.
    • Dataproc su GKE impone limitazioni alle proprietà fornite dagli utenti. Dataproc on GKE monta le configurazioni da configMap in /etc/spark/conf nel contenitore, sostituendo le impostazioni incorporate nell'immagine.

Immagini Spark di base

Dataproc supporta le seguenti immagini container Spark di base:

  • Spark 2.4: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_1.5
  • Spark 3.1: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0

Esempio di creazione di immagini container personalizzate

Dockerfile di esempio

FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest

# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root

# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
    && chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
    spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage

# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh

# (Optional) Set user back to `spark`.
USER spark

Crea l'immagine container

Esegui questi comandi nella directory Dockerfile

  1. Imposta immagine (esempio: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) e passa alla directory di build.
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. Scarica il connettore BigQuery.

    gcloud storage cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. Creare un file di esempio Python.

    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

  4. Crea uno script di inizializzazione di esempio.

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. Crea ed esegui il push dell'immagine.

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"