Sie können ein benutzerdefiniertes Container-Image angeben, das mit Managed Service for Apache Spark in GKE verwendet werden soll . Für Ihr benutzerdefiniertes Container-Image muss eines der Basis-Spark-Images für Managed Service for Apache Spark in GKE verwendet werden.
Benutzerdefiniertes Container-Image verwenden
Wenn Sie ein benutzerdefiniertes Container-Image für Managed Service for Apache Spark in GKE verwenden möchten, legen Sie die spark.kubernetes.container.image property fest, wenn Sie einen virtuellen Cluster für Managed Service for Apache Spark in GKE erstellen oder einen Spark-Job für den Cluster senden.
- Beispiel für die Clustererstellung mit der gcloud CLI:
gcloud dataproc clusters gke create "${DP_CLUSTER}" \ --properties=spark:spark.kubernetes.container.image=custom-image \ ... other args ... - Beispiel für das Einreichen eines Jobs mit der gcloud CLI:
gcloud dataproc jobs submit spark \ --properties=spark.kubernetes.container.image=custom-image \ ... other args ...
Anforderungen und Einstellungen für benutzerdefinierte Container-Images
Basis-Images
Sie können docker-Tools verwenden, um benutzerdefinierte Docker-Images basierend auf einem der veröffentlichten Basis-Spark-Images für Managed Service for Apache Spark on GKE zu erstellen.
Container-Nutzer
Managed Service for Apache Spark in GKE führt Spark-Container als Linux-Nutzer spark mit einer 1099-UID und einer 1099-GID aus. Verwenden Sie die UID und GID für Dateisystemberechtigungen.
Wenn Sie beispielsweise eine JAR-Datei unter /opt/spark/jars/my-lib.jar im Image als Arbeitslastabhängigkeit hinzufügen, müssen Sie dem Nutzer spark die Leseberechtigung für die Datei erteilen.
Komponenten
Java:Die Umgebungsvariable
JAVA_HOMEverweist auf den Speicherort der Java-Installation. Der aktuelle Standardwert ist/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64. Dieser kann sich ändern. Aktuelle Informationen finden Sie in den Versionshinweisen zu Managed Service for Apache Spark.- Wenn Sie die Java-Umgebung anpassen, muss
JAVA_HOMEauf den richtigen Speicherort festgelegt sein undPATHden Pfad zu Binärdateien enthalten.
- Wenn Sie die Java-Umgebung anpassen, muss
Python:In den Basis-Spark-Images für Managed Service for Apache Spark in GKE ist Miniconda3 unter
/opt/condainstalliert.CONDA_HOMEverweist auf diesen Ort,${CONDA_HOME}/binist inPATHenthalten undPYSPARK_PYTHONist auf${CONDA_HOME}/pythongesetzt.Wenn Sie Conda anpassen, achten Sie darauf ,dass
CONDA_HOMEauf das Conda-Basisverzeichnis verweist,${CONDA_HOME}/bininPATHenthalten ist undPYSPARK_PYTHONauf${CONDA_HOME}/python.festgelegt ist.Sie können Pakete in der Standardbasisumgebung installieren, entfernen und aktualisieren oder eine neue Umgebung erstellen. Es wird jedoch dringend empfohlen, dass die Umgebung alle Pakete enthält, die in der Basisumgebung des Basis-Container-Images installiert sind.
Wenn Sie dem Container-Image Python-Module hinzufügen, z. B. ein Python-Skript mit Hilfsfunktionen, fügen Sie die Modulverzeichnisse in
PYTHONPATHein.
Spark:Spark ist in
/usr/lib/sparkinstalliert undSPARK_HOMEverweist auf diesen Speicherort. Spark kann nicht angepasst werden. Wenn sie geändert wird, wird das Container-Image abgelehnt oder funktioniert nicht richtig.Jobs: Sie können Spark-Jobabhängigkeiten anpassen.
SPARK_EXTRA_CLASSPATHdefiniert den zusätzlichen Klassenpfad für Spark-JVM-Prozesse. Empfehlung: Speichern Sie die JAR-Dateien unter/opt/spark/jarsund legen SieSPARK_EXTRA_CLASSPATHauf/opt/spark/jars/*fest.Wenn Sie das Job-JAR in das Image einbetten, ist das empfohlene Verzeichnis
/opt/spark/job. Wenn Sie den Job senden, können Sie mit einem lokalen Pfad darauf verweisen, z. B.file:///opt/spark/job/my-spark-job.jar.Cloud Storage-Connector:Der Cloud Storage-Connector ist unter
/usr/lib/spark/jarsinstalliert.Dienstprogramme: Für die Ausführung von Spark sind die Dienstprogramm-Pakete
procpsundtinierforderlich. Diese Dienstprogramme sind in den Spark-Basis-Images enthalten, sodass sie in benutzerdefinierten Images nicht neu installiert werden müssen.Einstiegspunkt:Managed Service for Apache Spark in GKE ignoriert alle Änderungen, die an den Primitiven
ENTRYPOINTundCMDim Container-Image vorgenommen wurden.Initialisierungsskripte:Sie können unter
/opt/init-script.shein optionales Initialisierungsskript hinzufügen. Ein Initialisierungsskript kann Dateien aus Cloud Storage herunterladen, einen Proxy im Container starten, andere Skripts aufrufen und andere Startaufgaben ausführen.Das Einstiegspunkt-Skript ruft das Initialisierungsskript mit allen Befehlszeilenargumenten (
$@) auf, bevor der Spark-Treiber, der Spark-Executor und andere Prozesse gestartet werden. Im Initialisierungsskript kann der Typ des Spark-Prozesses anhand des ersten Arguments ($1) ausgewählt werden. Mögliche Werte sindspark-submitfür Treibercontainer undexecutorfür Executor-Container.
Konfigurationen:Spark-Konfigurationen befinden sich unter
/etc/spark/conf. Die UmgebungsvariableSPARK_CONF_DIRverweist auf diesen Speicherort.Passen Sie die Spark-Konfigurationen nicht im Container-Image an. Stattdessen sollten Sie alle Eigenschaften über die Managed Service for Apache Spark on GKE API einreichen. Das hat folgende Gründe:
- Einige Eigenschaften, z. B. die Größe des Executorspeichers, werden zur Laufzeit und nicht beim Erstellen des Container-Images festgelegt. Sie müssen von Managed Service for Apache Spark on GKE eingefügt werden.
- Für Managed Service for Apache Spark auf GKE gelten Einschränkungen für die von Nutzern angegebenen Eigenschaften.
Bei Managed Service for Apache Spark in GKE werden Konfigurationen aus
configMapin/etc/spark/confim Container bereitgestellt. Dadurch werden die im Image eingebetteten Einstellungen überschrieben.
Spark-Basis-Images
Managed Service for Apache Spark unterstützt die folgenden Basis-Spark-Container-Images:
- Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2
Beispiel für das Erstellen eines benutzerdefinierten Container-Images
Beispiel für ein Dockerfile
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
Container-Image erstellen
Führen Sie die folgenden Befehle im Dockerfile-Verzeichnis aus.
- Legen Sie das Bild fest (z. B.
us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) und wechseln Sie zum Build-Verzeichnis.IMAGE=custom container image \ BUILD_DIR=$(mktemp -d) \ cd "${BUILD_DIR}" Laden Sie den BigQuery-Connector herunter.
gcloud storage cp \ gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
Erstellen Sie eine Python-Beispieldatei.
cat >test_util.py <<'EOF' def hello(name): print("hello {}".format(name))
def read_lines(path): with open(path) as f: return f.readlines() EOFErstellen Sie ein Beispiel-Init-Skript.
cat >init-script.sh <<EOF echo "hello world" >/tmp/init-script.out EOF
Erstellen Sie das Image und übertragen Sie es per Push.
docker build -t "${IMAGE}" . && docker push "${IMAGE}"