Puoi specificare un'immagine container personalizzata da utilizzare con Dataproc su GKE . L'immagine del contenitore personalizzata deve utilizzare una delle immagini Spark di base di Dataproc su GKE.
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 di un cluster con l'interfaccia a riga di comando gcloud:
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ...
- Esempio di invio di un job con gcloud CLI:
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
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 in /opt/spark/jars/my-lib.jar
nell'immagine come dipendenza del carico di lavoro, devi concedere all'utente spark
l'autorizzazione di lettura al 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 chePATH
includa il percorso ai file binari.
- Se personalizzi l'ambiente Java, assicurati che
Python: le immagini di base Spark di Dataproc su GKE hanno Miniconda3 installato in
/opt/conda
.CONDA_HOME
rimanda a questa posizione,${CONDA_HOME}/bin
è incluso inPATH
ePYSPARK_PYTHON
è impostato su${CONDA_HOME}/python
.Se personalizzi Conda, assicurati che
CONDA_HOME
indichi la home directory di Conda, che${CONDA_HOME}/bin
sia incluso inPATH
e chePYSPARK_PYTHON
sia 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 includa tutti i pacchetti installati nell'ambiente di base dell'immagine contenitore 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
eSPARK_HOME
fa riferimento a questa posizione. Spark non può essere personalizzato. Se viene modificata, l'immagine del contenitore verrà rifiutata o non funzionerà correttamente.Job: puoi personalizzare le dipendenze dei job Spark.
SPARK_EXTRA_CLASSPATH
definisce il percorso di classe aggiuntivo per i processi JVM di Spark. Consiglio: inserisci i barattoli in/opt/spark/jars
e impostaSPARK_EXTRA_CLASSPATH
su/opt/spark/jars/*
.Se incorpori il file jar del job nell'immagine, la directory consigliata è
/opt/spark/job
. Quando invii il job, puoi fare riferimento a un percorso locale, ad esempiofile:///opt/spark/job/my-spark-job.jar
.Connettore Cloud Storage:il connettore Cloud Storage è installato in
/usr/lib/spark/jars
.Utilità: i pacchetti di utilità
procps
etini
sono necessari per eseguire Spark. Queste utilità sono incluse nelle immagini di base di Spark, quindi non è necessario riinstallarle per le immagini personalizzate.Punto di contatto: Dataproc su GKE ignora qualsiasi modifica apportata alle primitive
ENTRYPOINT
eCMD
nell'immagine del contenitore.Script di inizializzazione:puoi aggiungere uno script di inizializzazione facoltativo in
/opt/init-script.sh
. Uno script di inizializzazione può scaricare file da Cloud Storage, avviare un proxy all'interno del contenitore, chiamare altri script ed eseguire altre attività di avvio.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 può selezionare il tipo di processo Spark in base al primo parametro ($1
): i valori possibili includonospark-submit
per i contenitori del driver eexecutor
per i contenitori dell'executor.
Configurazioni:le configurazioni di Spark si trovano in
/etc/spark/conf
. La variabile di ambienteSPARK_CONF_DIR
punta a questa posizione.Non personalizzare le configurazioni di 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 su GKE monta le configurazioni da
configMap
in/etc/spark/conf
nel contenitore, sostituendo le impostazioni incorporate nell'immagine.
Immagini di base Spark
Dataproc supporta le seguenti immagini di 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
Creazione di un'immagine container personalizzata di esempio
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 i seguenti comandi nella directory Dockerfile
- Imposta l'immagine (ad es.
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest
) e passa alla directory di compilazione.IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}"
Scarica il connettore BigQuery.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
Crea 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() EOFCrea uno script di inizializzazione di esempio.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Crea ed esegui il push dell'immagine.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"