Die neueste Version von Spark 3 HelloWorld

Spark wurde auf 3.1.1 veröffentlicht, und ich habe mir dieses Projekt lange nicht mehr angesehen. Ich habe heute das lokale Lager aktualisiert und es ist ein Fehler bei der Kompilierung aufgetreten.

$ mvn kompilieren
......
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/SparkContext.scala:403: Typkonflikt;
 gefunden: Map [String, org.apache.spark.resource.ResourceInformation]
 Erforderlich: scala.collection.immutable.Map [String, org.apache.spark.ResourceInformation]
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/SparkContext.scala:404: Typkonflikt;
 gefunden: scala.collection.immutable.Map [String, org.apache.spark.ResourceInformation]
 Erforderlich: Map [String, org.apache.spark.resource.ResourceInformation]
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/SparkContext.scala:554: Überladener Methodenwert gilt mit Alternativen:
  (env: org.apache.spark.SparkEnv, resources: java.util.Map [String, org.apache.spark.resource.ResourceInformation]) Option [org.apache.spark.internal.plugin.PluginContainer] <und>
  (sc: org.apache.spark.SparkContext, resources: java.util.Map [String, org.apache.spark.resource.ResourceInformation]) Option [org.apache.spark.internal.plugin.PluginContainer]
 kann nicht angewendet werden auf (org.apache.spark.SparkContext, java.util.Map [String, org.apache.spark.ResourceInformation])
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/api/java/JavaSparkContext.scala:118: Typinkongruenz;
 gefunden: java.util.Map [String, org.apache.spark.ResourceInformation]
 Erforderlich: java.util.Map [String, org.apache.spark.resource.ResourceInformation]
[INFO] [Info]: java.util.Map [String, org.apache.spark.ResourceInformation] <: java.util.Map [String, org.apache.spark.resource.ResourceInformation]?
[INFO] [Info]: falsch
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:308: Zu viele Argumente (6) für die Methode resolveMavenDependencies: ( packagesExclusions: String, packages: String, Repositorys: String, ivyRepoPath: String, ivySettingsPath: Option [String]) String
Beachten Sie, dass 'packagesTransitive' kein Parametername der aufgerufenen Methode ist.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:377: Nicht genügend Argumente für die Methode downloadFile: (Pfad: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:380: Nicht genügend Argumente für die Methode downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:383: Nicht genügend Argumente für die Methode downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:392: Nicht genügend Argumente für die Methode downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:396: Nicht genügend Argumente für die Methode downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:450: Nicht genügend Argumente für die Methode downloadFile: (Pfad: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) String.
Nicht spezifizierter Wertparameter secMgr.
[FEHLER] [Fehler] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/scheduler/Task.scala:101: Typfehlanpassung;
 gefunden: Map [String, org.apache.spark.resource.ResourceInformation]
 Erforderlich: Map [String, org.apache.spark.ResourceInformation]
[INFO] [Info]: Map [String, org.apache.spark.resource.ResourceInformation] <: Map [String, org.apache.spark.ResourceInformation]?
[INFO] [Info]: falsch
[FEHLER] 12 Fehler gefunden
......

Ich habe das Projekt README schnell gelesen. Es stellt sich heraus, dass die lokale Umgebung die Anforderungen des neuen Spark nicht mehr erfüllen kann. Das Spark-Projekt enthält auch die entsprechenden Kompilierungswerkzeuge und kompiliert nur gemäß der Dokumentation.

Wenn Sie dieses Projekt noch nicht heruntergeladen haben, können Sie das Projekt mit git clone lokal herunterladen:

Git-Klon https://github.com/apache/spark.git


Geben Sie das Projektverzeichnis ein und kompilieren Sie:

$ cd spark
$. / build / mvn -DskipTests sauberes Paket
......
[INFO] Reaktorübersicht für Spark Project Parent POM 3.2.0-SNAPSHOT:
[DIE INFO] 
[INFO] Spark Project Parent POM ........................... ERFOLG [2.562 s]
[INFO] Spark-Projekt-Tags ................................. ERFOLG [5.148 s]
[INFO] Spark Project Sketch ............................... ERFOLG [5.963 s]
[INFO] Spark Project Local DB ............................. ERFOLG [1.505 s]
[INFO] Spark Project Networking ........................... ERFOLG [2.883 s]
[INFO] Spark Project Shuffle Streaming Service ............ ERFOLG [1.516 s]
[INFO] Spark-Projekt unsicher ............................... ERFOLG [7.137 s]
[INFO] Spark Project Launcher ............................. ERFOLG [1.516 s]
[INFO] Spark Project Core ................................. ERFOLG [01:55 min]
[INFO] Spark Project ML Local Library ..................... ERFOLG [36.128 s]
[INFO] Spark Project GraphX ​​............................... ERFOLG [30.925 s]
[INFO] Spark-Projekt-Streaming ............................ ERFOLG [53.579 s]
[INFO] Spark Project Catalyst ............................. ERFOLG [03:50 min]
[INFO] Spark Project SQL .................................. ERFOLG [07:58 min]
[INFO] Spark Project ML Library ........................... ERFOLG [02:42 min]
[INFO] Spark Project Tools ................................ ERFOLG [13.733 s]
[INFO] Spark Project Hive ................................. ERFOLG [04:52 min]
[INFO] Spark Project REPL ................................. ERFOLG [34.085 s]
[INFO] Spark Project Assembly ............................. ERFOLG [8.368 s]
[INFO] Kafka 0.10+ Token Provider für Streaming ........... ERFOLG [01:06 min]
[INFO] Spark-Integration für Kafka 0.10 ................... ERFOLG [02:08 min]
[INFO] Kafka 0.10+ Quelle für strukturiertes Streaming ........ ERFOLG [01:24 min]
[INFO] Spark-Projektbeispiele ............................. ERFOLG [01:01 min]
[INFO] Spark-Integration für Kafka 0.10 Assembly .......... ERFOLG [10.397 s]
[INFO] Spark Avro ......................................... ERFOLG [01: 12 min]
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] ERFOLG BAUEN
[DIE INFO] ----------------------------------------------- -------------------------
[INFO] Gesamtzeit: 31:51 min
[INFO] Beendet um: 2021-03-13T17: 28: 05 + 08: 00
[DIE INFO] ----------------------------------------------- -------------------------

Aufgrund der Ergebnisse der Kompilierung hat sich die Spark3-Projektstruktur erheblich geändert, z. B. Tags / Sketch / LocalDB /, die zuvor noch nicht gesehen wurden. Wir werden vorstellen, was jedes Unterprojekt in Zukunft tut. Als Nächstes führen wir HelloWorld aus Der einfachste Weg, Spark auszuprobieren, ist die Verwendung der Scala-Shell:

tianlang @ tianlang: spark $ ./bin/spark-shell 
2021-03-14 08: 51: 53,351 WARN util.Utils: Ihr Hostname Tianlang wird in eine Loopback-Adresse aufgelöst: 127.0.0.1; Verwenden Sie stattdessen 192.168.0.104 (auf der Schnittstelle wlp7s0).
2021-03-14 08: 51: 53,352 WARN util.Utils: Legen Sie SPARK_LOCAL_IP fest, wenn Sie an eine andere Adresse binden müssen
Festlegen der Standardprotokollstufe auf "WARN".
Verwenden Sie zum Anpassen der Protokollierungsstufe sc.setLogLevel (newLevel). Verwenden Sie für SparkR setLogLevel (newLevel).
2021-03-14 08: 52: 01,141 WARN util.NativeCodeLoader: Native-Hadoop-Bibliothek für Ihre Plattform kann nicht geladen werden ... ggf. mithilfe von integrierten Java-Klassen
Spark-Kontext-Web-Benutzeroberfläche verfügbar unter http://192.168.0.104:4040
Spark-Kontext als 'sc' verfügbar (master = local [*], app id = local-1615683123916).
Spark-Sitzung als 'Spark' verfügbar.
Willkommen zu
      ____ __
     / __ / __ ___ _____ / / __
    _ \ \ / _ \ / _ `/ __ / '_ /
   / ___ / .__ / \ _, _ / _ / / _ / \ _ \ Version 3.2.0-SNAPSHOT
      / _ /
         
Verwenden von Scala Version 2.12.10 (Java HotSpot (TM) 64-Bit-Server-VM, Java 1.8.0_201)
Geben Sie Ausdrücke ein, damit sie ausgewertet werden.
Geben Sie Folgendes ein: help, um weitere Informationen zu erhalten.

scala> spark.range (1000 * 1000 * 1000) .count ();
res0: Long = 1000000000

spark.range (1000 * 1000 * 1000) generiert eine Sequenz von 0 (einschließlich) bis 1 Milliarde (nicht enthalten), die als Tabelle t_range mit nur einer Spalte betrachtet werden kann:

1
2
......
999999998
999999999


Count () berechnet die Anzahl der Datenelemente, und ein Element wird insgesamt als 1 Milliarde gezählt. Dies entspricht der SQL-Auswahl count (*) aus t_range. Die Zählfunktion von SQL ist leicht zu verwechseln, die Summenfunktion von SQL ist die Summe Die Summe der Daten ergibt die Summe aller Werte in der Sequenz: 0 + 1 + 2 + 3 + ... + 999999998 + 9999999999; Anzahl ist die Anzahl der Daten in der Sequenz unter Statistik der Wert 1 oder 999999998: 1 + 1 + 1 + ...... + 1 + 1;

In SparkShell können Sie sum nicht direkt aufrufen, um die Werte in der Sequenz zu summieren:

scala> spark.range (1000 * 1000 * 1000) .sum ();
<console>: 24: error: value sum ist kein Mitglied von org.apache.spark.sql.Dataset [Long]
       spark.range (1000 * 1000 * 1000) .sum ();

Wie kann die Summenoperation implementiert werden, da das von spark.range generierte Dataset-Objekt keine Summenfunktion hat?

In der Dokumentation zur Spark-API können Sie überprüfen , welche Funktionen des Datensatzes verwendet werden können:

Das erste, was ich gesehen habe, ist die Zusammenfassung, die der Summe ähnlicher ist. Sehen Sie sich die Einführung an. Es spielt keine Rolle, ob Sie kein Englisch verstehen, Sie können den Beispielcode sehen. Ich habe festgestellt, dass er zum Zählen verwendet werden kann Die Gesamtzahl / Durchschnitt / Maximum / Minimum Warten hat einfach nicht die Summe genommen. Es scheint nicht, dass der Name wie die Funktion ist.

Wenn Sie zuvor Big Data ausgesetzt waren, sollten Sie von MapReduce gehört haben. Es sollte einfacher sein, die Reduzierungsfunktion zu finden:

defreduzieren (Funktion: (T, T) ⇒ T): T.

(Scala-spezifisch) Reduziert die Elemente dieses Datensatzes mithilfe der angegebenen Binärfunktion. Das Gegebene  func muss kommutativ und assoziativ sein, sonst kann das Ergebnis nicht deterministisch sein.

Nehmen Sie die Summe mit reduzieren:

scala> spark.range (1000 * 1000 * 1000) .reduce ((a, b) => a + b)
<Konsole>: 24: Fehler: Überladener Methodenwert mit Alternativen reduzieren:
  (func: org.apache.spark.api.java.function.ReduceFunction [java.lang.Long]) java.lang.Long <und>
  (func: (java.lang.Long, java.lang.Long) => java.lang.Long) java.lang.Long
 kann nicht angewendet werden auf ((java.lang.Long, java.lang.Long) => scala.Long)
       spark.range (1000 * 1000 * 1000) .reduce ((a, b) => a + b)

Stellen Sie eine Summenfunktion zum Reduzieren und Melden eines Fehlers bereit. Aus der Fehlermeldung geht hervor, dass der Datentyp nicht übereinstimmt. Lassen Sie uns eine erzwungene Typkonvertierung durchführen:

scala> spark.range (1000 * 1000 * 1000) .reduce ((a, b) => (a + b). asInstanceOf [java.lang.Long])
res11: Long = 49999999950000000000  

Natürlich können Sie auch andere Methoden verwenden, um die Summe zu erzielen, z. B. foreach, aber die Ausführungsmethode unterscheidet sich von der Reduzierung, und wir haben die Möglichkeit, später darüber zu sprechen. 

Sie sollten auch das Gefühl haben, dass die Verwendung der Reduktionsfunktion weitaus weniger bequem ist als die Summenfunktion in SQL. Die Funktionen in SQL werden jetzt als deklarative APIs mit den gängigeren Wörtern bezeichnet. Sie müssen nur auf das achten, was ich möchte, nicht wie Reduzieren. Ich muss darauf achten, wie es geht.

Dies ist auch einer der Gründe, warum SQL schon lange Bestand hat. Spark hat auch das Spark-SQL-Modul zur Unterstützung der SQL-Syntax sehr früh bereitgestellt. Sie können zurückblicken und feststellen, dass sich das zuvor verwendete Dataset unter dem SQL-Paket befindet:

scala> spark.range (1000 * 1000 * 1000);
res2: org.apache.spark. sql .Dataset [Long] = [id: bigint]

Wir haben bereits zuvor gesagt, dass das Bereichsergebnis mit einer Tabelle mit nur einer Spalte verglichen werden kann und es nicht zufällig ist, darüber zu sprechen. Es ist wirklich möglich, SQL-Anweisungen darauf auszuführen:

Registrieren Sie zuerst den Datensatz als temporäre Ansicht (er kann auch als temporäre Tabelle bezeichnet werden, aber die API zum Registrieren einer temporären Tabelle wird nach 2.0.0 als veraltet markiert):

scala> spark.range (1000 * 1000 * 1000) .createOrReplaceTempView ("t_range");

Anschließend können Sie SQL in der Ansicht t_range ausführen :


scala> spark.sql (" Summe (ID) aus t_range auswählen");
res18 : org.apache.spark.sql.DataFrame = [sum (id): bigint]

scala> res18 .collect
res19: Array [org.apache.spark.sql.Row] = Array ([ 499999999500000000 ])

Woher weiß ich, dass der Spaltenname id ist ? Dies geschieht über die Funktion printSchema .

scala> spark.range (1000 * 1000 * 1000). printSchema ();
root
 | - id: long (nullable = false)

Der obige Code verwendet alle Scala, wenn Sie Python bevorzugen. Sie können auch ./bin/pyspark verwenden. Die Unterstützung von Spark3 für Python erwähnt auch eine neue Ebene.

HelloWorld ist zuerst hier. Die Ameisen kauen Stück für Stück an ihren Knochen.


Ich denke du magst

Origin blog.51cto.com/14256460/2659042
Empfohlen
Rangfolge