In dieser Anleitung werden verschiedene Möglichkeiten zum Erstellen und Senden eines Spark-Scala-Jobs an einen Managed Service for Apache Spark-Cluster beschrieben. Dazu gehören:
- Schreiben und kompilieren Sie eine Spark Scala-Anwendung „Hello World“ auf einem lokalen Computer über die Befehlszeile mit der Scala REPL (Read-Evaluate-Print-Loop oder interaktiver Interpreter) oder dem SBT-Build-Tool.
- Kompilierte Scala-Klassen in eine JAR-Datei mit einem Manifest kompilieren
- die Scala-JAR-Datei an einen Spark-Job senden, der in Ihrem Managed Service for Apache Spark-Cluster ausgeführt wird
- Scala-Jobausgabe in der Google Cloud Console prüfen
In dieser Anleitung lernen Sie außerdem Folgendes:
einen Spark Scala-MapReduce-Job „WordCount“ direkt auf einem Managed Service for Apache Spark-Cluster mit der
spark-shell-REPL schreiben und ausführenVorinstallierte Apache Spark- und Hadoop-Beispiele auf einem Cluster ausführen
Google Cloud -Projekt einrichten
Führen Sie ggf. die folgenden Aufgaben aus:
- Projekt einrichten
- Cloud Storage-Bucket erstellen
- Managed Service for Apache Spark-Cluster erstellen
Scala-Code lokal schreiben und kompilieren
Schreiben Sie als einfache Übung für diese Anleitung eine „Hello World“-Scala-Anwendung mit der Scala REPL oder der SBT-Befehlszeile lokal auf Ihrem Entwicklungscomputer.
Scala verwenden
- Laden Sie die Scala-Binärdateien von der Seite Scala-Installation herunter.
Entpacken Sie die Datei, legen Sie die Umgebungsvariable
SCALA_HOMEfest und fügen Sie sie Ihrem Pfad hinzu, wie in der Scala-Installationsanleitung beschrieben. Beispiel:export SCALA_HOME=/usr/local/share/scala export PATH=$PATH:$SCALA_HOME/
Starten Sie die Scala-REPL
$ scala Welcome to Scala version ... Type in expressions to have them evaluated. Type :help for more information. scala>
Kopieren Sie den Code
HelloWorldund fügen Sie ihn in die Scala-REPL ein.object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
Speichern Sie
HelloWorld.scalaund beenden Sie die REPL.scala> :save HelloWorld.scala scala> :q
Kompilieren Sie den Code mit
scalac.$ scalac HelloWorld.scala
Listen Sie die kompilierten
.class-Dateien auf.$ ls HelloWorld*.class HelloWorld$.class HelloWorld.class
SBT verwenden
Erstellen Sie ein "HelloWorld"-Projekt (siehe unten)
$ mkdir hello $ cd hello $ echo \ 'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \ HelloWorld.scalaErstellen Sie eine
sbt.build-Konfigurationsdatei, umartifactName(den Namen der JAR-Datei, die Sie unten generieren) auf „HelloWorld.jar“ festzulegen (siehe Standardartefakte ändern).echo \ 'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => "HelloWorld.jar" }' > \ build.sbtStarten Sie SBT und führen Sie den Code aus
$ sbt [info] Set current project to hello ... > run ... Compiling 1 Scala source to .../hello/target/scala-.../classes... ... Running HelloWorld Hello, world! [success] Total time: 3 s ...
Verpacken Sie den Code in eine JAR-Datei mit einem Manifest, das den Einstiegspunkt der Hauptklasse angibt (
HelloWorld), und beenden Sie dann SBT.> package ... Packaging .../hello/target/scala-.../HelloWorld.jar ... ... Done packaging. [success] Total time: ... > exit
JAR-Datei erstellen
Erstellen Sie eine JAR-Datei mit SBT oder mit dem Befehl jar.
JAR-Datei erstellen
mit SBT
Der SBT-Befehl package erstellt eine JAR-Datei (siehe SBT verwenden).
JAR-Datei erstellen
manuell
- Ändern Sie das Verzeichnis (
cd) in das Verzeichnis, das die kompiliertenHelloWorld*.class-Dateien enthält. Führen Sie dann den folgenden Befehl aus, um die Klassendateien in einer JAR-Datei zu verpacken, die ein Manifest enthält, das den Einstiegspunkt der Hauptklasse angibt (HelloWorld).$ jar cvfe HelloWorld.jar HelloWorld HelloWorld*.class added manifest adding: HelloWorld$.class(in = 637) (out= 403)(deflated 36%) adding: HelloWorld.class(in = 586) (out= 482)(deflated 17%)
JAR-Datei in Cloud Storage kopieren
- Verwenden Sie die Google Cloud CLI, um die JAR-Datei in einen Cloud Storage-Bucket in Ihrem Projekt zu kopieren.
$ gcloud storage cp HelloWorld.jar gs://<bucket-name>/ Copying file://HelloWorld.jar [Content-Type=application/java-archive]... Uploading gs://bucket-name/HelloWorld.jar: 1.46 KiB/1.46 KiB
JAR-Datei an einen Managed Service for Apache Spark-Job senden
Verwenden Sie die Google Cloud Console, um die JAR-Datei an Ihren Managed Service for Apache Spark-Job zu senden. Füllen Sie die Felder auf der Seite Job senden so aus:
- Computing-Typ für Job auswählen: Spark in Compute Engine
- Cluster job details:
- Cluster: Wählen Sie den Namen des Clusters aus der Clusterliste aus
Dateien und Artefakte:
- Jobtyp: Spark (Scala/Java)
Treiberkonfiguration: Wählen Sie URI der JAR-Hauptdatei aus und geben Sie im Feld JAR-Hauptdatei den Cloud Storage-URI-Pfad zu Ihrer HelloWorld-JAR-Datei (
gs://your-bucket-name/HelloWorld.jar) an.Wenn Ihre JAR-Datei kein Manifest enthält, das den Einstiegspunkt für Ihren Code angibt ("Main-Class: HelloWorld"), wählen Sie unter Treiberkonfiguration die Option Hauptklasse aus, geben Sie den Namen Ihrer Hauptklasse ("HelloWorld") in das Feld Hauptklasse ein und füllen Sie das Feld JAR-Dateien mit dem URI-Pfad zu Ihrer JAR-Datei (
gs://your-bucket-name/HelloWorld.jar) aus.
Klicken Sie auf Senden, um den Job zu starten. Nach dem Start wird der Job zur Jobliste hinzugefügt.
Klicken Sie auf die Job-ID, um die Seite Jobs zu öffnen. Dort können Sie die Treiberausgabe des Jobs aufrufen.
Spark Scala-Code mit der REPL spark-shell des Clusters schreiben und ausführen
Möglicherweise möchten Sie Scala-Anwendungen direkt in Ihrem Managed Service for Apache Spark-Cluster entwickeln. Hadoop und Spark sind auf Managed Service for Apache Spark-Clustern vorinstalliert und mit dem Cloud Storage-Connector konfiguriert. Dadurch kann Ihr Code Daten direkt aus Cloud Storage lesen und in Cloud Storage schreiben.
In diesem Beispiel wird gezeigt, wie Sie über SSH eine Verbindung zum Clustermaster des Managed Service for Apache Spark-Clusters herstellen und dann mit der REPL spark-shell eine Scala-Wordcount-MapReduce-Anwendung erstellen und ausführen.
SSH-Verbindung zum Clustermasterknoten herstellen
Rufen Sie in der Google Cloud Console die Seite Cluster auf und klicken Sie auf den Namen Ihres Clusters.
Wählen Sie auf der Clusterdetailseite den Tab VM-Instanzen aus und klicken Sie dann auf die SSH-Auswahl, die rechts neben der Zeile mit dem Clusternamen angezeigt wird.
Im Stammverzeichnis des Master-Knotens wird ein Browserfenster angezeigt.
Starten Sie
spark-shell.$ spark-shell ... Using Scala version ... Type in expressions to have them evaluated. Type :help for more information. ... Spark context available as sc. ... SQL context available as sqlContext. scala>
Erstellen Sie ein RDD (Resilient Distributed Dataset) aus einem Shakespeare-Textausschnitt, der sich in einem öffentlichen Cloud Storage-Bucket befindet.
scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")Führen Sie eine WordCount-MapReduce-Berechnung für den Text aus und zeigen Sie das
wordcounts-Ergebnis an.scala> val wordCounts = text_file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b) scala> wordCounts.collect ... Array((call,1), (What's,1), (sweet.,1), (we,1), (as,1), (name?,1), (any,1), (other,1), (rose,1), (smell,1), (name,1), (a,2), (would,1), (in,1), (which,1), (That,1), (By,1))Speichern Sie die Werte in
<bucket-name>/wordcounts-outin Cloud Storage und beenden Sie dannscala-shell.scala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/") scala> exitVerwenden Sie die gcloud CLI, um die Ausgabedateien aufzulisten und den Dateiinhalt anzuzeigen.
$ gcloud storage ls gs://bucket-name/wordcounts-out/ gs://spark-scala-demo-bucket/wordcounts-out/ gs://spark-scala-demo-bucket/wordcounts-out/_SUCCESS gs://spark-scala-demo-bucket/wordcounts-out/part-00000 gs://spark-scala-demo-bucket/wordcounts-out/part-00001
Prüfen Sie den Inhalt von
gs://<bucket-name>/wordcounts-out/part-00000.$ gcloud storage cat gs://bucket-name/wordcounts-out/part-00000 (call,1) (What's,1) (sweet.,1) (we,1) (as,1) (name?,1) (any,1) (other,1)
Vorinstallierten Beispielcode ausführen
Der Clustermasterknoten enthält ausführbare JAR-Dateien mit Standardbeispielen für Apache Hadoop und Spark.
| JAR-Typ | Master node /usr/lib/ location |
GitHub-Quelle | Apache-Dokumente |
|---|---|---|---|
| Hadoop | hadoop-mapreduce/hadoop-mapreduce-examples.jar |
Quelllink | MapReduce-Anleitung |
| Spark | spark/lib/spark-examples.jar |
Quelllink | Spark-Beispiele |
Beispiele über die Befehlszeile an Ihren Cluster senden
Beispiele können von Ihrer lokalen Entwicklungsmaschine mit dem Google Cloud CLI-Befehlszeilentool gcloud gesendet werden (siehe Google Cloud Console verwenden, um Jobs über die Google Cloud Console zu senden).
Beispiel für Hadoop WordCount
gcloud dataproc jobs submit hadoop --cluster=cluster-name \ --region=region \ --jars=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \ --class=org.apache.hadoop.examples.WordCount \ -- URI of input file URI of output file
Beispiel für Spark WordCount
gcloud dataproc jobs submit spark --cluster=cluster-name \ --region=region \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ --class=org.apache.spark.examples.JavaWordCount \ -- URI of input file
Cluster herunterfahren
Um laufende Gebühren zu vermeiden, fahren Sie den Cluster herunter und löschen Sie die für diese Anleitung verwendeten Cloud Storage-Ressourcen (Cloud Storage-Bucket und -Dateien).
So fahren Sie den Cluster herunter:
gcloud dataproc clusters delete cluster-name \ --region=region
So löschen Sie die Cloud Storage-JAR-Datei:
gcloud storage rm gs://bucket-name/HelloWorld.jar
Mit dem folgenden Befehl können Sie einen Bucket sowie alle zugehörigen Ordner und Dateien löschen:
gcloud storage rm gs://bucket-name/ --recursive