Sie können einen Job an einen vorhandenen Managed Service for Apache Spark-Cluster senden. Verwenden Sie dazu eine HTTP- oder programmatische jobs.submit-API-Anfrage, das gcloud-Befehlszeilentool der Google Cloud CLI in einem lokalen Terminalfenster oder in Cloud Shell oder die Google Cloud Console, die in einem lokalen Browser geöffnet ist. Sie können auch eine SSH-Verbindung zur Masterinstanz in Ihrem Cluster herstellen und dann einen Job direkt von der Instanz aus ausführen, ohne Managed Service for Apache Spark zu verwenden.
Gleichzeitige Jobs:
Sie können die maximale Anzahl gleichzeitiger Managed Service for Apache Spark-Jobs mit der Cluster-Property dataproc:dataproc.scheduler.max-concurrent-jobs konfigurieren, wenn Sie einen Cluster erstellen. Wenn dieser Attributwert nicht festgelegt ist, wird die Obergrenze für gleichzeitige Jobs als max((masterMemoryMb - 3584) / masterMemoryMbPerJob, 5) berechnet.
masterMemoryMb wird durch den Maschinentyp der Master-VM bestimmt.
masterMemoryMbPerJob ist standardmäßig 1024, kann aber bei der Clustererstellung mit dem Clusterattribut dataproc:dataproc.scheduler.driver-size-mb konfiguriert werden.
Job einreichen
Klassenpfad-Isolierung und benutzerdefinierte JARs: Kopieren Sie benutzerdefinierte „Fat JARs“ oder Bundle-JARs (z. B. Apache Iceberg-Laufzeit oder Google Cloud -Bundles) nicht direkt in Cluster-Systemverzeichnisse wie /usr/lib/spark/jars/. Wenn Sie benutzerdefinierte JAR-Dateien in Systemverzeichnissen ablegen, wird der Klassenpfad des Managed Service for Apache Spark-Agents mit transitiven Abhängigkeiten (z. B. Guava- oder Hadoop-Bibliotheken) verunreinigt, die mit den integrierten Bibliotheken des Agents in Konflikt stehen. Dieser Konflikt kann bei der Ausführung von Jobverwaltungsvorgängen wie dem Abbrechen eines Jobs zu Fehlern bei der Klassenauflösung (z. B. ClassNotFoundException oder NoClassDefFoundError) führen, was zum Absturz des Agents führt und YARN-Anwendungen verwaist.
Verwenden Sie stattdessen einen der folgenden unterstützten Ansätze:
- Jobspezifische Abhängigkeiten: Geben Sie den Cloud Storage-Pfad zu Ihren JAR-Dateien an, wenn Sie den Job einreichen. Verwenden Sie dazu das Flag
--jarsin der Google Cloud CLI, das Feld JAR-Dateien in der Google Cloud Console oder das FeldjarFileUrisin der API. Spark verteilt die Abhängigkeiten an den Treiber und die Executors für den Job, ohne den Klassenpfad des Agents zu beeinträchtigen. - Clusterweite Abhängigkeiten: Geben Sie Abhängigkeiten bei der Clustererstellung mit der Cluster-Property
spark:spark.jarsan: Dadurch wird Managed Service for Apache Spark angewiesen,--properties="spark:spark.jars=gs://YOUR_BUCKET/jar-1.jar,gs://YOUR_BUCKET/jar-2.jar"
/etc/spark/conf/spark-defaults.confzu konfigurieren. Die Abhängigkeiten werden automatisch auf die Spark-Treiber- und Executor-Klassenpfade für alle Jobs verteilt, während der knotenlokale Managed Service for Apache Spark-Agent sauber isoliert bleibt.
Console
Öffnen Sie in der Google Cloud Console in Ihrem Browser die Seite Job senden für Managed Service for Apache Spark.
Spark-Job – Beispiel
Wenn Sie einen Spark-Beispieljob senden möchten, füllen Sie die Felder auf der Seite Job senden so aus:
- Wählen Sie unter Computing-Typ für Job auswählen die Option Spark in Compute Engine aus.
- Geben Sie im Abschnitt Cluster-Jobdetails eine Job-ID an oder übernehmen Sie die Standard-ID und wählen Sie Ihren Cluster aus der Clusterliste aus.
- Im Bereich Dateien und Artefakte:
- Legen Sie als Jobtyp Spark (Scala/Java) (
Spark) fest. - Wählen Sie unter Treiberkonfiguration die Option Hauptklasse aus und legen Sie für Hauptklasse den Wert
org.apache.spark.examples.SparkPifest. - Legen Sie für Arguments (Argumente) das einzelne Argument
1000fest. - Fügen Sie
file:///usr/lib/spark/examples/jars/spark-examples.jarzu JAR-Dateien (oder dem API-FeldjarFileUris) hinzu:file:///gibt ein Hadoop LocalFileSystem-Schema an. Managed Service for Apache Spark hat/usr/lib/spark/examples/jars/spark-examples.jarauf dem Masterknoten des Clusters installiert, als der Cluster erstellt wurde. Dieser Pfad wird nur für vorinstallierte Beispiele verwendet, die von Managed Service for Apache Spark bereitgestellt werden. Kopieren Sie benutzerdefinierte JAR-Dateien nicht in Systemverzeichnisse (siehe Warnung unter Job senden).- Alternativ können Sie einen Cloud Storage-Pfad (
gs://your-bucket/your-jarfile.jar) oder einen Hadoop Distributed File System-Pfad (hdfs://path-to-jar.jar) zu einer Ihrer JAR-Dateien angeben. Wenn Sie den Job über die API senden, geben Sie diesen Pfad im FeldjarFileUrisan.
- Legen Sie als Jobtyp Spark (Scala/Java) (
Klicken Sie auf Submit (Senden), um den Job zu starten. Nach dem Start wird der Job der Jobliste hinzugefügt.
Klicken Sie auf die Job-ID, um die Seite Jobs zu öffnen. Dort können Sie die Treiberausgabe des Jobs aufrufen. Da dieser Job lange Ausgabezeilen erzeugt, die die Breite des Browserfensters überschreiten, können Sie das Kästchen Zeilenumbruch aktivieren, um den gesamten Ausgabetext anzuzeigen und das berechnete Ergebnis für pi zu sehen.
Sie können die Treiberausgabe Ihres Jobs über die Befehlszeile mit dem unten gezeigten Befehl gcloud dataproc jobs wait aufrufen. Weitere Informationen finden Sie unter Jobausgabe ansehen – GCLOUD-BEFEHL.
Kopieren Sie die Projekt-ID und fügen Sie sie als den Wert für das Flag --project ein. Kopieren Sie anschließend die Job-ID (in der Jobliste angezeigt) und fügen Sie sie als endgültiges Argument ein.
gcloud dataproc jobs wait job-id \ --project=project-id \ --region=region
Hier sind Snippets aus der Treiberausgabe für den Beispieljob SparkPi:
... 2015-06-25 23:27:23,810 INFO [dag-scheduler-event-loop] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Stage 0 (reduce at SparkPi.scala:35) finished in 21.169 s 2015-06-25 23:27:23,810 INFO [task-result-getter-3] cluster.YarnScheduler (Logging.scala:logInfo(59)) - Removed TaskSet 0.0, whose tasks have all completed, from pool 2015-06-25 23:27:23,819 INFO [main] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Job 0 finished: reduce at SparkPi.scala:35, took 21.674931 s Pi is roughly 3.14189648 ... Job [c556b47a-4b46-4a94-9ba2-2dcee31167b2] finished successfully. driverOutputUri: gs://sample-staging-bucket/google-cloud-dataproc-metainfo/cfeaa033-749e-48b9-... ...
gcloud
Wenn Sie einen Job an einen Managed Service for Apache Spark-Cluster senden möchten, führen Sie den gcloud CLI-Befehl gcloud dataproc jobs submit lokal in einem Terminalfenster oder in Cloud Shell aus.
gcloud dataproc jobs submit job-command \ --cluster=cluster-name \ --region=region \ other dataproc-flags \ -- job-args
- Listen Sie das öffentlich zugängliche
hello-world.pyin Cloud Storage auf. Dateiauflistung:gcloud storage cat gs://dataproc-examples/pyspark/hello-world/hello-world.py
#!/usr/bin/python import pyspark sc = pyspark.SparkContext() rdd = sc.parallelize(['Hello,', 'world!']) words = sorted(rdd.collect()) print(words)
- Senden Sie den PySpark-Job an Managed Service for Apache Spark.
Terminalausgabe:gcloud dataproc jobs submit pyspark \ gs://dataproc-examples/pyspark/hello-world/hello-world.py \ --cluster=cluster-name \ --region=region
Waiting for job output... … ['Hello,', 'world!'] Job finished successfully.
- Führen Sie das SparkPi-Beispiel aus, das auf dem Masterknoten des Managed Service for Apache Spark-Clusters vorinstalliert ist. (Der Pfad
file:///usr/lib/spark/examples/jars/spark-examples.jarist nur für vorinstallierte Beispiele vorgesehen. Informationen zu benutzerdefinierten JAR-Abhängigkeiten finden Sie im Abschnitt „Achtung“ unter Job einreichen.) Terminalausgabe:gcloud dataproc jobs submit spark \ --cluster=cluster-name \ --region=region \ --class=org.apache.spark.examples.SparkPi \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ -- 1000
Job [54825071-ae28-4c5b-85a5-58fae6a597d6] submitted. Waiting for job output… … Pi is roughly 3.14177148 … Job finished successfully. …
REST
In diesem Abschnitt erfahren Sie, wie Sie einen Spark-Job senden, um den ungefähren Wert von pi mit der Managed Service for Apache Spark API jobs.submit zu berechnen.
Ersetzen Sie diese Werte in den folgenden Anfragedaten:
- project-id: Google Cloud -Projekt-ID
- region: Cluster-Region
- clusterName: Clustername
HTTP-Methode und URL:
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/jobs:submit
JSON-Text anfordern:
{
"job": {
"placement": {
"clusterName": "cluster-name"
},
"sparkJob": {
"args": [
"1000"
],
"mainClass": "org.apache.spark.examples.SparkPi",
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
}
}
}
Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:
Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:
{
"reference": {
"projectId": "project-id",
"jobId": "job-id"
},
"placement": {
"clusterName": "cluster-name",
"clusterUuid": "cluster-Uuid"
},
"sparkJob": {
"mainClass": "org.apache.spark.examples.SparkPi",
"args": [
"1000"
],
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
},
"status": {
"state": "PENDING",
"stateStartTime": "2020-10-07T20:16:21.759Z"
},
"jobUuid": "job-Uuid"
}
Java
Python
Go
Node.js
Job direkt an Cluster senden
Wenn Sie einen Job direkt auf Ihrem Cluster ausführen möchten, ohne den Managed Service for Apache Spark zu verwenden, stellen Sie eine SSH-Verbindung zum Masterknoten Ihres Clusters her und führen Sie den Job dann auf dem Masterknoten aus.
Nachdem Sie eine SSH-Verbindung zur Master-VM-Instanz hergestellt haben, führen Sie in einem Terminalfenster auf dem Masterknoten des Clusters Befehle aus, um Folgendes zu tun:
- Öffnen Sie eine Spark-Shell.
- Führen Sie einen Spark-Job aus, um die Anzahl der Zeilen in einer (siebenzeiligen) Python-„Hello World“-Datei zu zählen, die sich in einer öffentlich zugänglichen Cloud Storage-Datei befindet.
Beenden Sie die Shell.
user@cluster-name-m:~$ spark-shell ... scala> sc.textFile("gs://dataproc-examples" + "/pyspark/hello-world/hello-world.py").count ... res0: Long = 7 scala> :quit
Bash-Jobs in Managed Service for Apache Spark ausführen
Möglicherweise möchten Sie ein Bash-Skript als Managed Service for Apache Spark-Job ausführen, entweder weil die von Ihnen verwendeten Engines nicht als Managed Service for Apache Spark-Jobtyp auf oberster Ebene unterstützt werden oder weil Sie zusätzliche Einrichtungsschritte oder Berechnungen von Argumenten durchführen müssen, bevor Sie einen Job mit hadoop oder spark-submit aus Ihrem Skript starten.
Pig-Beispiel
Angenommen, Sie haben ein hello.sh-Bash-Skript in Cloud Storage kopiert:
gcloud storage cp hello.sh gs://${BUCKET}/hello.shDa der Befehl pig fs Hadoop-Pfade verwendet, kopieren Sie das Skript aus Cloud Storage an ein Ziel als file:///, damit es sich im lokalen Dateisystem statt in HDFS befindet. Die nachfolgenden sh-Befehle verweisen automatisch auf das lokale Dateisystem und erfordern nicht das Präfix file:///.
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
-e='fs -cp -f gs://${BUCKET}/hello.sh file:///tmp/hello.sh; sh chmod 750 /tmp/hello.sh; sh /tmp/hello.sh'Alternativ können Sie Ihr Cloud Storage-Shell-Script als --jars-Argument angeben, da das Argument --jars für die Jobübermittlung von Managed Service for Apache Spark eine Datei in einem temporären Verzeichnis bereitstellt, das für die Lebensdauer des Jobs erstellt wird:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=gs://${BUCKET}/hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'Beachten Sie, dass das Argument --jars auch auf ein lokales Skript verweisen kann:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'