Einführung in Apache Spark mit Beispielen und Anwendungsfällen

Veröffentlicht: 2022-03-11

Ich habe Ende 2013 zum ersten Mal von Spark gehört, als ich mich für Scala zu interessieren begann, die Sprache, in der Spark geschrieben ist. Einige Zeit später führte ich ein lustiges Data-Science-Projekt durch, bei dem ich versuchte, das Überleben auf der Titanic vorherzusagen. Dies erwies sich als eine großartige Möglichkeit, um tiefer in Spark-Konzepte und -Programmierung eingeführt zu werden. Ich kann es allen aufstrebenden Spark-Entwicklern, die nach einem Einstieg suchen, wärmstens empfehlen.

Heute wird Spark von großen Akteuren wie Amazon, eBay und Yahoo! Viele Organisationen führen Spark auf Clustern mit Tausenden von Knoten aus. Laut der Spark-FAQ hat der größte bekannte Cluster über 8000 Knoten. In der Tat ist Spark eine Technologie, die es wert ist, beachtet und kennengelernt zu werden.

Dieser Artikel bietet eine Einführung in Spark, einschließlich Anwendungsfällen und Beispielen. Es enthält Informationen von der Apache Spark-Website sowie das Buch Learning Spark – Lightning-Fast Big Data Analysis.

Was ist Apache Spark? Eine Einleitung

Spark ist ein Apache-Projekt, das als „blitzschnelles Cluster-Computing“ beworben wird. Es hat eine blühende Open-Source-Community und ist derzeit das aktivste Apache-Projekt.

Spark bietet eine schnellere und allgemeinere Datenverarbeitungsplattform. Mit Spark können Sie Programme bis zu 100-mal schneller im Arbeitsspeicher oder 10-mal schneller auf der Festplatte ausführen als mit Hadoop. Letztes Jahr übernahm Spark Hadoop, indem es den 100-TB-Daytona-GraySort-Wettbewerb dreimal schneller auf einem Zehntel der Anzahl der Maschinen abschloss, und es wurde auch die schnellste Open-Source-Engine zum Sortieren eines Petabytes.

Spark ermöglicht es auch, Code schneller zu schreiben, da Ihnen über 80 High-Level-Operatoren zur Verfügung stehen. Um dies zu demonstrieren, schauen wir uns das „Hello World!“ an. von BigData: das Beispiel Word Count. Geschrieben in Java für MapReduce hat es ungefähr 50 Codezeilen, während Sie es in Spark (und Scala) so einfach machen können:

 sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")

Ein weiterer wichtiger Aspekt beim Erlernen der Verwendung von Apache Spark ist die interaktive Shell (REPL), die standardmäßig bereitgestellt wird. Mit REPL kann man das Ergebnis jeder Codezeile testen, ohne zuerst den gesamten Job codieren und ausführen zu müssen. Der Weg zum funktionierenden Code ist somit deutlich kürzer und eine Ad-hoc-Datenanalyse wird ermöglicht.

Weitere Schlüsselfunktionen von Spark sind:

  • Bietet derzeit APIs in Scala, Java und Python, mit Unterstützung für andere Sprachen (wie R) auf dem Weg
  • Lässt sich gut in das Hadoop-Ökosystem und die Datenquellen integrieren (HDFS, Amazon S3, Hive, HBase, Cassandra usw.)
  • Kann auf Clustern ausgeführt werden, die von Hadoop YARN oder Apache Mesos verwaltet werden, und kann auch eigenständig ausgeführt werden

Der Spark-Kern wird durch eine Reihe leistungsstarker Bibliotheken auf höherer Ebene ergänzt, die nahtlos in derselben Anwendung verwendet werden können. Zu diesen Bibliotheken gehören derzeit SparkSQL, Spark Streaming, MLlib (für maschinelles Lernen) und GraphX, die in diesem Artikel jeweils ausführlicher beschrieben werden. Weitere Spark-Bibliotheken und -Erweiterungen befinden sich derzeit ebenfalls in der Entwicklung.

Spark-Bibliotheken und -Erweiterungen

Funkenkern

Spark Core ist die Basis-Engine für die groß angelegte parallele und verteilte Datenverarbeitung. Es ist zuständig für:

  • Speicherverwaltung und Fehlerbehebung
  • Planen, Verteilen und Überwachen von Jobs auf einem Cluster
  • Interaktion mit Speichersystemen

Spark führt das Konzept eines RDD (Resilient Distributed Dataset) ein, einer unveränderlichen, fehlertoleranten, verteilten Sammlung von Objekten, die parallel bearbeitet werden können. Ein RDD kann jeden Objekttyp enthalten und wird erstellt, indem ein externer Datensatz geladen oder eine Sammlung aus dem Treiberprogramm verteilt wird.

RDDs unterstützen zwei Arten von Operationen:

  • Transformationen sind Operationen (wie Map, Filter, Join, Union usw.), die auf einem RDD ausgeführt werden und die ein neues RDD ergeben, das das Ergebnis enthält.
  • Aktionen sind Operationen (z. B. Reduce, Count, First usw.), die einen Wert zurückgeben, nachdem eine Berechnung auf einem RDD ausgeführt wurde.

Transformationen in Spark sind „faul“, was bedeutet, dass sie ihre Ergebnisse nicht sofort berechnen. Stattdessen „merken“ sie sich lediglich die auszuführende Operation und den Datensatz (z. B. Datei), an dem die Operation ausgeführt werden soll. Erst beim Aufruf einer Aktion werden die Transformationen tatsächlich berechnet und das Ergebnis an das Treiberprogramm zurückgegeben. Durch dieses Design kann Spark effizienter ausgeführt werden. Wenn beispielsweise eine große Datei auf verschiedene Weise transformiert und an die erste Aktion übergeben wurde, verarbeitete Spark nur das Ergebnis für die erste Zeile und gab es zurück, anstatt die Arbeit für die gesamte Datei zu erledigen.

Standardmäßig kann jedes transformierte RDD jedes Mal neu berechnet werden, wenn Sie eine Aktion darauf ausführen. Sie können ein RDD jedoch auch mit der Persistenz- oder Cache-Methode im Speicher beibehalten. In diesem Fall behält Spark die Elemente im Cluster für einen viel schnelleren Zugriff bei der nächsten Abfrage.

SparkSQL

SparkSQL ist eine Spark-Komponente, die das Abfragen von Daten entweder über SQL oder über die Hive-Abfragesprache unterstützt. Es entstand als Apache Hive-Port, der auf Spark (anstelle von MapReduce) ausgeführt wurde, und ist jetzt in den Spark-Stack integriert. Neben der Unterstützung verschiedener Datenquellen ermöglicht es das Verweben von SQL-Abfragen mit Codetransformationen, was zu einem sehr leistungsfähigen Tool führt. Unten sehen Sie ein Beispiel für eine Hive-kompatible Abfrage:

 // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)") sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src") // Queries are expressed in HiveQL sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Spark-Streaming

Spark Streaming unterstützt die Echtzeitverarbeitung von Streaming-Daten, z. B. Protokolldateien von Produktions-Webservern (z. B. Apache Flume und HDFS/S3), soziale Medien wie Twitter und verschiedene Messaging-Warteschlangen wie Kafka. Unter der Haube empfängt Spark Streaming die Eingabedatenströme und teilt die Daten in Stapel auf. Als Nächstes werden sie von der Spark-Engine verarbeitet und generieren den endgültigen Ergebnisstrom in Stapeln, wie unten dargestellt.

Spark-Streaming

Die Spark-Streaming-API entspricht genau der des Spark-Core und erleichtert Programmierern die Arbeit in der Welt von Batch- und Streaming-Daten.

MLlib

MLlib ist eine Bibliothek für maschinelles Lernen, die verschiedene Algorithmen bereitstellt, die zum Aufskalieren auf einem Cluster für Klassifizierung, Regression, Clustering, kollaboratives Filtern usw. entwickelt wurden (weitere Informationen zu diesem Thema finden Sie in Toptals Artikel über maschinelles Lernen). Einige dieser Algorithmen funktionieren auch mit Streaming-Daten, wie z. B. lineare Regression mit gewöhnlichen kleinsten Quadraten oder K-Means-Clustering (und mehr in Vorbereitung). Apache Mahout (eine Bibliothek für maschinelles Lernen für Hadoop) hat sich bereits von MapReduce abgewendet und sich auf Spark MLlib zusammengeschlossen.

GrafikX

graphx

GraphX ​​ist eine Bibliothek zum Manipulieren von Graphen und zum Durchführen von Graph-parallelen Operationen. Es bietet ein einheitliches Werkzeug für ETL, explorative Analysen und iterative Graphenberechnungen. Abgesehen von integrierten Operationen für die Diagrammmanipulation bietet es eine Bibliothek gängiger Diagrammalgorithmen wie PageRank.

So verwenden Sie Apache Spark: Anwendungsfall zur Ereigniserkennung

Nachdem wir nun die Frage „Was ist Apache Spark?“ beantwortet haben, überlegen wir uns, für welche Art von Problemen oder Herausforderungen es am effektivsten eingesetzt werden könnte.

Ich bin kürzlich auf einen Artikel über ein Experiment zur Erkennung eines Erdbebens durch die Analyse eines Twitter-Streams gestoßen. Interessanterweise wurde gezeigt, dass diese Technik Sie wahrscheinlich schneller über ein Erdbeben in Japan informiert als die Japan Meteorological Agency. Obwohl sie in ihrem Artikel unterschiedliche Technologien verwendet haben, denke ich, dass es ein großartiges Beispiel ist, um zu sehen, wie wir Spark mit vereinfachten Code-Snippets und ohne Glue-Code verwenden können.

Zunächst müssten wir Tweets filtern, die relevant erscheinen, wie „Erdbeben“ oder „Beben“. Wir könnten Spark Streaming für diesen Zweck wie folgt verwenden:

 TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

Dann müssten wir eine semantische Analyse der Tweets durchführen, um festzustellen, ob sie sich anscheinend auf ein aktuelles Erdbebenereignis beziehen. Tweets wie „Erdbeben!“ oder „Jetzt wackelt es“ würden beispielsweise als positive Übereinstimmungen gewertet, Tweets wie „Teilnahme an einer Erdbebenkonferenz“ oder „Das Erdbeben gestern war beängstigend“ dagegen nicht. Die Autoren der Arbeit verwendeten zu diesem Zweck eine Support-Vektor-Maschine (SVM). Wir werden hier dasselbe tun, können aber auch eine Streaming-Version ausprobieren. Ein resultierendes Codebeispiel von MLlib würde wie folgt aussehen:

 // We would prepare some earthquake tweet data and load it in LIBSVM format. val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt") // Split data into training (60%) and test (40%). val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) // Run training algorithm to build the model val numIterations = 100 val model = SVMWithSGD.train(training, numIterations) // Clear the default threshold. model.clearThreshold() // Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label) } // Get evaluation metrics. val metrics = new BinaryClassificationMetrics(scoreAndLabels) val auROC = metrics.areaUnderROC() println("Area under ROC = " + auROC)

Wenn wir mit der Vorhersagerate des Modells zufrieden sind, könnten wir zur nächsten Stufe übergehen und reagieren, wenn wir ein Erdbeben entdecken. Um einen zu erkennen, benötigen wir eine bestimmte Anzahl (dh Dichte) positiver Tweets in einem definierten Zeitfenster (wie im Artikel beschrieben). Beachten Sie, dass wir für Tweets mit aktivierten Twitter-Ortungsdiensten auch den Ort des Erdbebens extrahieren würden. Mit diesem Wissen ausgestattet, konnten wir SparkSQL verwenden und eine vorhandene Hive-Tabelle (in der Benutzer gespeichert sind, die am Empfang von Erdbebenbenachrichtigungen interessiert sind) abfragen, um ihre E-Mail-Adressen abzurufen und ihnen eine personalisierte Warn-E-Mail wie folgt zu senden:

 // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) // sendEmail is a custom function sqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)

Andere Apache Spark-Anwendungsfälle

Mögliche Anwendungsfälle für Spark gehen natürlich weit über die Erkennung von Erdbeben hinaus.

Hier ist eine kurze (aber sicherlich nicht annähernd erschöpfende!) Auswahl anderer Anwendungsfälle, die den Umgang mit der Geschwindigkeit, Vielfalt und Menge von Big Data erfordern, für die Spark so gut geeignet ist:

In der Spieleindustrie ist das Verarbeiten und Entdecken von Mustern aus dem potenziellen Feuerschlauch von Echtzeit-In-Game-Ereignissen und die Möglichkeit, sofort darauf zu reagieren, eine Fähigkeit, die ein lukratives Geschäft für Zwecke wie Spielerbindung, gezielte Werbung und Auto einbringen könnte -Anpassung der Komplexitätsstufe, und so weiter.

In der E-Commerce-Branche könnten Echtzeit-Transaktionsinformationen an einen Streaming-Clustering-Algorithmus wie k-means oder eine kollaborative Filterung wie ALS weitergegeben werden. Die Ergebnisse könnten dann sogar mit anderen unstrukturierten Datenquellen wie Kundenkommentaren oder Produktbewertungen kombiniert und verwendet werden, um Empfehlungen im Laufe der Zeit ständig zu verbessern und an neue Trends anzupassen.

In der Finanz- oder Sicherheitsbranche könnte der Spark-Stack auf ein Betrugs- oder Einbruchserkennungssystem oder eine risikobasierte Authentifizierung angewendet werden. Es könnte erstklassige Ergebnisse erzielen, indem es riesige Mengen archivierter Protokolle sammelt und mit externen Datenquellen kombiniert, wie Informationen über Datenschutzverletzungen und kompromittierte Konten (siehe beispielsweise https://haveibeenpwned.com/) und Informationen aus der Verbindung/ Anfrage wie IP-Geolokalisierung oder Zeit.

Fazit

Zusammenfassend trägt Spark dazu bei, die herausfordernde und rechenintensive Aufgabe der Verarbeitung großer Mengen von Echtzeit- oder archivierten Daten, sowohl strukturiert als auch unstrukturiert, zu vereinfachen und relevante komplexe Funktionen wie maschinelles Lernen und Graphalgorithmen nahtlos zu integrieren. Spark bringt Big Data-Verarbeitung in die Massen. Hör zu!