Was ist Apache Spark? Die Big-Data-Plattform, die Hadoop zerstört hat

Apache Spark definiert

Apache Spark ist ein Datenverarbeitungsframework, das Verarbeitungsaufgaben für sehr große Datenmengen schnell ausführen und Datenverarbeitungsaufgaben entweder allein oder zusammen mit anderen verteilten Computerwerkzeugen auf mehrere Computer verteilen kann. Diese beiden Eigenschaften sind der Schlüssel zu den Welten des Big Data und des maschinellen Lernens, die das Sammeln massiver Rechenleistung erfordern, um große Datenspeicher zu durchsuchen. Spark entlastet Entwickler auch von der Programmierlast dieser Aufgaben mit einer benutzerfreundlichen API, die einen Großteil der Hauptarbeit des verteilten Rechnens und der Verarbeitung großer Datenmengen abstrahiert.

Seit seinen bescheidenen Anfängen im AMPLab an der UC Berkeley im Jahr 2009 hat sich Apache Spark zu einem der weltweit wichtigsten Frameworks für die verteilte Verarbeitung großer Datenmengen entwickelt. Spark kann auf verschiedene Arten bereitgestellt werden, bietet native Bindungen für die Programmiersprachen Java, Scala, Python und R und unterstützt SQL, Streaming-Daten, maschinelles Lernen und Grafikverarbeitung. Sie finden es bei Banken, Telekommunikationsunternehmen, Spielefirmen, Regierungen und allen großen Technologiegiganten wie Apple, Facebook, IBM und Microsoft.

Apache Spark-Architektur

Grundsätzlich besteht eine Apache Spark-Anwendung aus zwei Hauptkomponenten: einem Treiber, der den Benutzercode in mehrere Aufgaben konvertiert, die auf Arbeitsknoten verteilt werden können, und Ausführenden, die auf diesen Knoten ausgeführt werden und die ihnen zugewiesenen Aufgaben ausführen. Eine Form von Cluster-Manager ist erforderlich, um zwischen den beiden zu vermitteln.

Spark kann standardmäßig in einem eigenständigen Cluster-Modus ausgeführt werden, für den lediglich das Apache Spark-Framework und eine JVM auf jedem Computer in Ihrem Cluster erforderlich sind. Es ist jedoch wahrscheinlicher, dass Sie ein robusteres Ressourcen- oder Cluster-Management-System nutzen möchten, um die Zuweisung von Mitarbeitern nach Bedarf für Sie zu gewährleisten. Im Unternehmen bedeutet dies normalerweise, dass Hadoop YARN ausgeführt wird (auf diese Weise führen die Cloudera- und Hortonworks-Distributionen Spark-Jobs aus), Apache Spark kann jedoch auch auf Apache Mesos, Kubernetes und Docker Swarm ausgeführt werden.

Wenn Sie nach einer verwalteten Lösung suchen, finden Sie Apache Spark als Teil von Amazon EMR, Google Cloud Dataproc und Microsoft Azure HDInsight. Databricks, das Unternehmen, das die Gründer von Apache Spark beschäftigt, bietet auch die Databricks Unified Analytics Platform an, einen umfassenden verwalteten Service, der Apache Spark-Cluster, Streaming-Unterstützung, integrierte webbasierte Notebook-Entwicklung und optimierte Cloud-E / A-Leistung bietet eine Standard-Apache Spark-Distribution.

Apache Spark erstellt die Datenverarbeitungsbefehle des Benutzers in einem Directed Acyclic Graph (DAG). Die DAG ist die Planungsschicht von Apache Spark. Es bestimmt, welche Aufgaben auf welchen Knoten und in welcher Reihenfolge ausgeführt werden.  

Spark vs. Hadoop: Warum Apache Spark verwenden?

Es ist erwähnenswert, dass Apache Spark gegen Apache Hadoop eine Art Fehlbezeichnung ist. Spark ist heutzutage in den meisten Hadoop-Distributionen enthalten. Aufgrund zweier großer Vorteile ist Spark zum bevorzugten Rahmen für die Verarbeitung von Big Data geworden und hat das alte MapReduce-Paradigma überholt, das Hadoop bekannt gemacht hat.

Der erste Vorteil ist die Geschwindigkeit. Mit der In-Memory-Daten-Engine von Spark können Aufgaben in bestimmten Situationen bis zu hundertmal schneller als mit MapReduce ausgeführt werden, insbesondere im Vergleich zu mehrstufigen Jobs, bei denen der Status zwischen den Phasen wieder auf die Festplatte geschrieben werden muss. Im Wesentlichen erstellt MapReduce ein zweistufiges Ausführungsdiagramm, das aus Datenabbildung und -reduzierung besteht, während die DAG von Apache Spark über mehrere Stufen verfügt, die effizienter verteilt werden können. Selbst Apache Spark-Jobs, bei denen die Daten nicht vollständig im Speicher enthalten sein können, sind in der Regel etwa zehnmal schneller als ihre MapReduce-Gegenstücke.

Der zweite Vorteil ist die entwicklerfreundliche Spark-API. So wichtig die Beschleunigung von Spark auch ist, man könnte argumentieren, dass die Freundlichkeit der Spark-API noch wichtiger ist.

Funkenkern

Im Vergleich zu MapReduce und anderen Apache Hadoop-Komponenten ist die Apache Spark-API sehr entwicklerfreundlich und verbirgt einen Großteil der Komplexität einer verteilten Verarbeitungs-Engine hinter einfachen Methodenaufrufen. Das kanonische Beispiel hierfür ist, wie fast 50 Zeilen MapReduce-Code zum Zählen von Wörtern in einem Dokument auf nur wenige Zeilen Apache Spark (hier in Scala gezeigt) reduziert werden können:

val textFile = sparkSession.sparkContext.textFile ("hdfs: /// tmp / words")

val count = textFile.flatMap (line => line.split (““))

                      .map (Wort => (Wort, 1))

                      .reduceByKey (_ + _)

count.saveAsTextFile ("hdfs: /// tmp / words_agg")

Durch die Bereitstellung von Bindungen zu gängigen Sprachen für die Datenanalyse wie Python und R sowie zu unternehmensfreundlicherem Java und Scala ermöglicht Apache Spark jedem, vom Anwendungsentwickler bis zum Datenwissenschaftler, die Skalierbarkeit und Geschwindigkeit auf zugängliche Weise zu nutzen.

Spark RDD

Das Herzstück von Apache Spark ist das Konzept des Resilient Distributed Dataset (RDD), einer Programmierabstraktion, die eine unveränderliche Sammlung von Objekten darstellt, die auf einen Computercluster aufgeteilt werden können. Vorgänge auf den RDDs können auch auf den Cluster aufgeteilt und in einem parallelen Stapelprozess ausgeführt werden, was zu einer schnellen und skalierbaren parallelen Verarbeitung führt.

RDDs können aus einfachen Textdateien, SQL-Datenbanken, NoSQL-Speichern (wie Cassandra und MongoDB), Amazon S3-Buckets und vielem mehr erstellt werden. Ein Großteil der Spark Core-API basiert auf diesem RDD-Konzept, das herkömmliche Zuordnungen ermöglicht und die Funktionalität reduziert, aber auch integrierte Unterstützung für das Zusammenfügen von Datensätzen, Filtern, Abtasten und Aggregieren bietet.

Spark wird verteilt ausgeführt, indem ein Treiberkernprozess kombiniert wird, der eine Spark-Anwendung in Aufgaben aufteilt und diese auf viele Executor- Prozesse verteilt, die die Arbeit erledigen. Diese Executoren können je nach Bedarf der Anwendung vergrößert und verkleinert werden.

Spark SQL

Ursprünglich als Shark bekannt, ist Spark SQL für das Apache Spark-Projekt immer wichtiger geworden. Dies ist wahrscheinlich die Schnittstelle, die heutige Entwickler beim Erstellen von Anwendungen am häufigsten verwenden. Spark SQL konzentriert sich auf die Verarbeitung strukturierter Daten unter Verwendung eines Datenrahmenansatzes, der von R und Python (in Pandas) entlehnt wurde. Wie der Name schon sagt, bietet Spark SQL auch eine SQL2003-kompatible Schnittstelle zum Abfragen von Daten, die sowohl Analysten als auch Entwicklern die Leistungsfähigkeit von Apache Spark bietet.

Neben der Standard-SQL-Unterstützung bietet Spark SQL eine Standardschnittstelle zum Lesen und Schreiben in andere Datenspeicher, einschließlich JSON, HDFS, Apache Hive, JDBC, Apache ORC und Apache Parquet, die alle sofort unterstützt werden. Andere beliebte Geschäfte - Apache Cassandra, MongoDB, Apache HBase und viele andere - können verwendet werden, indem separate Konnektoren aus dem Spark Packages-Ökosystem gezogen werden.

Das Auswählen einiger Spalten aus einem Datenrahmen ist so einfach wie diese Zeile:

StädteDF.select ("Name", "Pop")

Über die SQL-Schnittstelle registrieren wir den Datenrahmen als temporäre Tabelle, wonach wir SQL-Abfragen dagegen ausgeben können:

StädteDF.createOrReplaceTempView ("Städte")

spark.sql ("Name AUSWÄHLEN, Pop aus Städten")

Hinter den Kulissen verwendet Apache Spark einen Abfrageoptimierer namens Catalyst, der Daten und Abfragen untersucht, um einen effizienten Abfrageplan für die Datenlokalität und -berechnung zu erstellen, der die erforderlichen Berechnungen im gesamten Cluster ausführt. In der Apache Spark 2.x-Ära ist die Spark-SQL-Schnittstelle von Datenrahmen und Datasets (im Wesentlichen ein typisierter Datenrahmen, der zur Kompilierungszeit auf Richtigkeit überprüft werden kann und zur Laufzeit weitere Speicher- und Rechenoptimierungen nutzt) der empfohlene Entwicklungsansatz . Die RDD-Schnittstelle ist weiterhin verfügbar, wird jedoch nur empfohlen, wenn Ihre Anforderungen im Spark SQL-Paradigma nicht berücksichtigt werden können.

In Spark 2.4 wurde eine Reihe integrierter Funktionen höherer Ordnung eingeführt, mit denen Arrays und andere Datentypen höherer Ordnung direkt bearbeitet werden können.

Spark MLlib

Apache Spark bündelt auch Bibliotheken zum Anwenden von Techniken des maschinellen Lernens und der Diagrammanalyse auf skalierte Daten. Spark MLlib enthält ein Framework zum Erstellen von Pipelines für maschinelles Lernen, mit dem die Extraktion, Auswahl und Transformation von Features in jedem strukturierten Dataset einfach implementiert werden kann. MLlib wird mit verteilten Implementierungen von Clustering- und Klassifizierungsalgorithmen wie k-means Clustering und zufälligen Gesamtstrukturen geliefert, die problemlos in benutzerdefinierte Pipelines und aus benutzerdefinierten Pipelines ausgetauscht werden können. Modelle können von Datenwissenschaftlern in Apache Spark mit R oder Python trainiert, mit MLlib gespeichert und dann für die Produktion in eine Java- oder Scala-basierte Pipeline importiert werden.

Beachten Sie, dass Spark MLlib zwar das grundlegende maschinelle Lernen einschließlich Klassifizierung, Regression, Clustering und Filterung abdeckt, jedoch keine Funktionen zum Modellieren und Trainieren tiefer neuronaler Netze enthält (Einzelheiten siehe Spark MLlib-Übersicht). Deep Learning Pipelines sind jedoch in Arbeit.

Spark GraphX

Spark GraphX ​​enthält eine Auswahl verteilter Algorithmen zur Verarbeitung von Diagrammstrukturen, einschließlich einer Implementierung von Googles PageRank. Diese Algorithmen verwenden den RDD-Ansatz von Spark Core zur Modellierung von Daten. Mit dem GraphFrames-Paket können Sie Diagrammoperationen für Datenrahmen ausführen, einschließlich der Nutzung des Catalyst-Optimierers für Diagrammabfragen.

Spark Streaming

Spark Streaming war eine frühe Ergänzung zu Apache Spark, die dazu beitrug, in Umgebungen, in denen Echtzeit- oder nahezu Echtzeitverarbeitung erforderlich war, Fuß zu fassen. Bisher waren Batch- und Stream-Verarbeitung in der Welt von Apache Hadoop getrennte Dinge. Sie würden MapReduce-Code für Ihre Stapelverarbeitungsanforderungen schreiben und so etwas wie Apache Storm für Ihre Echtzeit-Streaming-Anforderungen verwenden. Dies führt offensichtlich zu unterschiedlichen Codebasen, die für die Anwendungsdomäne synchron gehalten werden müssen, obwohl sie auf völlig unterschiedlichen Frameworks basieren, unterschiedliche Ressourcen erfordern und unterschiedliche betriebliche Bedenken hinsichtlich ihrer Ausführung mit sich bringen.

Spark Streaming erweiterte das Apache Spark-Konzept der Stapelverarbeitung auf Streaming, indem der Stream in eine fortlaufende Reihe von Mikrobatches zerlegt wurde, die dann mithilfe der Apache Spark-API bearbeitet werden konnten. Auf diese Weise kann Code in Batch- und Streaming-Vorgängen (meistens) denselben Code gemeinsam nutzen, der auf demselben Framework ausgeführt wird, wodurch sowohl der Entwickler- als auch der Bedieneraufwand verringert werden. Jeder gewinnt.

Eine Kritik am Spark-Streaming-Ansatz ist, dass Microbatching in Szenarien, in denen eine Antwort mit geringer Latenz auf eingehende Daten erforderlich ist, möglicherweise nicht mit der Leistung anderer Streaming-fähiger Frameworks wie Apache Storm, Apache Flink und Apache Apex mithalten kann. Alle verwenden eine reine Streaming-Methode anstelle von Mikrobatches.

Strukturiertes Streaming

Strukturiertes Streaming (in Spark 2.x hinzugefügt) ist für Spark Streaming das, was Spark SQL für die Spark Core-APIs war: Eine übergeordnete API und eine einfachere Abstraktion zum Schreiben von Anwendungen. Im Fall von Struktur-Streaming können Entwickler mit der übergeordneten API im Wesentlichen unendlich viele Streaming-Datenrahmen und -Datensätze erstellen. Es löst auch einige sehr reale Probleme, mit denen Benutzer im früheren Framework zu kämpfen hatten, insbesondere im Hinblick auf die Behandlung von Ereigniszeitaggregationen und die verspätete Zustellung von Nachrichten. Alle Abfragen in strukturierten Streams durchlaufen das Catalyst-Abfrageoptimierungsprogramm und können sogar interaktiv ausgeführt werden, sodass Benutzer SQL-Abfragen für Live-Streaming-Daten ausführen können.

Structured Streaming stützte sich ursprünglich auf das Mikrobatching-Schema von Spark Streaming zur Verarbeitung von Streaming-Daten. In Spark 2.3 hat das Apache Spark-Team dem strukturierten Streaming einen kontinuierlichen Verarbeitungsmodus mit geringer Latenz hinzugefügt, der es ermöglicht, Antworten mit Latenzen von nur 1 ms zu verarbeiten, was sehr beeindruckend ist. Ab Spark 2.4 gilt die kontinuierliche Verarbeitung weiterhin als experimentell. Während strukturiertes Streaming auf der Spark SQL-Engine basiert, unterstützt Continuous Streaming nur einen eingeschränkten Satz von Abfragen.

Strukturiertes Streaming ist die Zukunft von Streaming-Anwendungen mit der Plattform. Wenn Sie also eine neue Streaming-Anwendung erstellen, sollten Sie strukturiertes Streaming verwenden. Die älteren Spark-Streaming-APIs werden weiterhin unterstützt, das Projekt empfiehlt jedoch die Portierung auf Structured Streaming, da die neue Methode das Schreiben und Verwalten von Streaming-Code wesentlich erträglicher macht.

Deep Learning Pipelines

Apache Spark unterstützt Deep Learning über Deep Learning Pipelines. Mit der vorhandenen Pipeline-Struktur von MLlib können Sie Deep-Learning-Bibliotheken auf niedrigerer Ebene aufrufen und Klassifizierer in nur wenigen Codezeilen erstellen sowie benutzerdefinierte TensorFlow-Diagramme oder Keras-Modelle auf eingehende Daten anwenden. Diese Diagramme und Modelle können sogar als benutzerdefinierte Spark-SQL-UDFs (benutzerdefinierte Funktionen) registriert werden, sodass die Deep-Learning-Modelle als Teil von SQL-Anweisungen auf Daten angewendet werden können.

Apache Spark-Tutorials

Bist du bereit, in Apache Spark einzutauchen und es zu lernen? Wir empfehlen Evan Heitmans A Neandertaler-Leitfaden zu Apache Spark in Python, der nicht nur die Grundlagen der Funktionsweise von Apache Spark in relativ einfachen Begriffen beschreibt, sondern Sie auch durch den Prozess des Schreibens einer einfachen Python-Anwendung führt, die das Framework verwendet . Der Artikel wurde aus der Sicht eines Datenwissenschaftlers verfasst. Dies ist sinnvoll, da Data Science eine Welt ist, in der Big Data und maschinelles Lernen immer wichtiger werden.

Wenn Sie nach Apache Spark-Beispielen suchen, um einen Eindruck davon zu bekommen, was die Plattform kann und wie sie es tut, lesen Sie Spark By {Beispiele}. Hier finden Sie zahlreiche Beispielcodes für eine Reihe grundlegender Aufgaben, aus denen die Bausteine ​​der Spark-Programmierung bestehen. Sie können also die Komponenten sehen, aus denen die größeren Aufgaben bestehen, für die Apache Spark erstellt wurde.

Müssen Sie tiefer gehen? DZone hat das, was es bescheiden nennt, die vollständige Apache Spark-Sammlung, die aus einer Reihe hilfreicher Tutorials zu vielen Apache Spark-Themen besteht. Viel Spaß beim Lernen!