Articles

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

Ich habe Ende 2013 zum ersten Mal von Spark gehört, als ich mich für Scala interessierte, die Sprache, in der Spark geschrieben ist. Einige Zeit später habe ich ein lustiges Datenwissenschaftsprojekt durchgeführt, um das Überleben auf der Titanic vorherzusagen. Dies erwies sich als eine großartige Möglichkeit, Spark-Konzepte und -Programmierung näher kennenzulernen. Ich kann es jedem aufstrebenden Spark-Entwickler wärmstens empfehlen, der nach einem Einstieg sucht.

Heute wird Spark von großen Playern 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, zur Kenntnis genommen und gelernt 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 Einführung

Spark ist ein Apache-Projekt, das als „Lightning Fast 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 100x schneller im Speicher oder 10x schneller auf der Festplatte ausführen als Hadoop. Letztes Jahr übernahm Spark Hadoop, indem es den 100 TB Daytona GraySort Contest 3x 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 hochrangige Operatoren zur Verfügung stehen. Um dies zu demonstrieren, werfen wir einen Blick auf die „Hallo Welt!“ von BigData: das Beispiel der Wortzahl. In Java für MapReduce geschrieben, hat es ungefähr 50 Zeilen Code, 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 es standardmäßig bereitstellt. 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 wichtige Funktionen von Spark sind:

  • Bietet derzeit APIs in Scala, Java und Python mit Unterstützung für andere Sprachen (wie R) auf dem Weg
  • Integriert sich gut in das Hadoop-Ökosystem und Datenquellen (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 näher erläutert werden. Weitere Spark-Bibliotheken und -Erweiterungen befinden sich derzeit ebenfalls in der Entwicklung.

Spark-Bibliotheken und -Erweiterungen

Spark Core

Spark Core ist die Basis-Engine für die parallele und verteilte Datenverarbeitung in großem Maßstab. Es ist verantwortlich 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 betrieben werden können. Eine RDD kann jeden Objekttyp enthalten und wird durch Laden eines externen Datasets oder Verteilen einer Sammlung aus dem Treiberprogramm erstellt.

RDDs unterstützen zwei Arten von Operationen:

  • Transformationen sind Operationen (wie Map, filter, Join, Union usw.), die auf einer RDD ausgeführt werden und eine neue RDD ergeben, die das Ergebnis enthält.
  • Aktionen sind Operationen (z. B. reduce, count, first usw.), die einen Wert zurückgeben, nachdem eine Berechnung für eine RDD ausgeführt wurde.

Transformationen in Spark sind „faul“, was bedeutet, dass sie ihre Ergebnisse nicht sofort berechnen. Stattdessen „merken“ sie sich nur den auszuführenden Vorgang und den Datensatz (z. B. die Datei), an dem der Vorgang ausgeführt werden soll. Die Transformationen werden nur dann tatsächlich berechnet, wenn eine Aktion aufgerufen wird und das Ergebnis an das Treiberprogramm zurückgegeben wird. Dieses Design ermöglicht es Spark, effizienter zu arbeiten. Wenn beispielsweise eine große Datei auf verschiedene Arten transformiert und an die erste Aktion übergeben wurde, verarbeitet und gibt Spark das Ergebnis nur für die erste Zeile zurück, anstatt die Arbeit für die gesamte Datei auszuführen.

Standardmäßig kann jede transformierte RDD jedes Mal neu berechnet werden, wenn Sie eine Aktion ausführen. In diesem Fall behält Spark die Elemente im Cluster bei, um bei der nächsten Abfrage viel schneller darauf zugreifen zu können.

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. Zusätzlich zur Unterstützung verschiedener Datenquellen ist es möglich, SQL-Abfragen mit Codetransformationen zu verweben, was zu einem sehr leistungsstarken Tool führt. Nachfolgend finden 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 HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Spark Streaming

Spark Streaming unterstützt die Echtzeitverarbeitung von Streaming-Daten, z. B. Produktions-Webserver-Protokolldateien (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-Kerns und erleichtert Programmierern die Arbeit in der Welt der Batch- und Streaming-Daten.

MLlib

MLlib ist eine Bibliothek für maschinelles Lernen, die verschiedene Algorithmen zur Skalierung auf einem Cluster für Klassifizierung, Regression, Clustering, kollaboratives Filtern usw. bereitstellt (weitere Informationen zu diesem Thema finden Sie in Toptals Artikel über maschinelles Lernen). Einige dieser Algorithmen arbeiten auch mit Streaming-Daten, z. B. lineare Regression mit gewöhnlichen kleinsten Quadraten oder k-Means-Clustering (und mehr auf dem Weg). Apache Mahout (eine maschinelle Lernbibliothek für Hadoop) hat sich bereits von MapReduce abgewandt und sich auf Spark MLlib zusammengeschlossen.

GraphX

graphx

GraphX ist eine Bibliothek zum Bearbeiten von Graphen und zum Ausführen von Graph-parallelen Operationen. Es bietet ein einheitliches Werkzeug für ETL, explorative Analyse und iterative Graphberechnungen. Neben integrierten Operationen für die Diagrammmanipulation bietet es eine Bibliothek gängiger Diagrammalgorithmen wie PageRank.

Verwendung von Apache Spark: Anwendungsfall zur Ereigniserkennung

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

Ich stieß kürzlich auf einen Artikel über ein Experiment zur Erkennung eines Erdbebens durch Analyse eines Twitter-Streams. 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 eine andere Technologie verwendet haben, denke ich, dass dies ein großartiges Beispiel dafür ist, wie wir Spark mit vereinfachten Codeausschnitten und ohne den Glue-Code verwenden können.

Zuerst müssten wir Tweets filtern, die relevant erscheinen, wie „Erdbeben“ oder „Schütteln“. Wir könnten Spark Streaming für diesen Zweck leicht 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 auf ein aktuelles Erdbebenereignis verweisen. Tweets wie „Erdbeben!“ oder „Jetzt zittert es“zum Beispiel würden als positive Übereinstimmungen angesehen, während Tweets wie „Teilnahme an einer Erdbebenkonferenz“ oder „Das Erdbeben gestern war beängstigend“dies nicht tun würden. Die Autoren des Papiers verwendeten zu diesem Zweck eine Support Vector Machine (SVM). Wir machen das Gleiche hier, können aber auch eine Streaming-Version ausprobieren. Ein daraus resultierendes Codebeispiel aus MLlib würde folgendermaßen 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 modelval numIterations = 100val 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 (d. H. 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 könnten wir SparkSQL verwenden und eine vorhandene Hive-Tabelle (in der Benutzer gespeichert sind, die an Erdbebenbenachrichtigungen interessiert sind) abfragen, um ihre E-Mail-Adressen abzurufen und ihnen eine personalisierte Warn-E-Mail zu senden, wie folgt:

// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.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!) Beispiele für andere Anwendungsfälle, die den Umgang mit der Geschwindigkeit, Vielfalt und dem Volumen von Big Data erfordern, für die Spark so gut geeignet ist:

In der Spieleindustrie ist die Verarbeitung und Erkennung von Mustern aus dem potenziellen Firehose von Echtzeit-In-Game-Events und die Möglichkeit, sofort darauf zu reagieren, eine Fähigkeit, die ein lukratives Geschäft für Zwecke wie Spielerbindung, gezielte Werbung, automatische Anpassung des Komplexitätsniveaus usw. ergeben könnte.

In der E-Commerce-Branche könnten Echtzeit-Transaktionsinformationen an einen Streaming-Clustering-Algorithmus wie k-means oder Collaborative Filtering wie ALS übergeben 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 große Mengen archivierter Protokolle sammelt und sie mit externen Datenquellen wie Informationen über Datenschutzverletzungen und kompromittierte Konten (siehe zum Beispiel https://haveibeenpwned.com/) und Informationen aus der Verbindung / Anfrage wie IP-Geolokalisierung oder Zeit kombiniert.

Fazit

Zusammenfassend lässt sich sagen, dass Spark dazu beiträgt, die anspruchsvolle und rechenintensive Aufgabe der Verarbeitung großer Mengen strukturierter und unstrukturierter Echtzeit- oder Archivdaten zu vereinfachen und relevante komplexe Funktionen wie maschinelles Lernen und Graph-Algorithmen nahtlos zu integrieren. Spark bringt Big Data-Verarbeitung zu den Massen. Probieren Sie es aus!