TECH HUDDLEWORKSHOPBIG DATAMACHINE LEARNING
Eine kleine Einführung in Spark
Big Data Cloud

Wenn Sie große Datenmengen blitzschnell streamen oder verarbeiten müssen, kommen Sie an Spark nicht vorbei. Apache Spark ist eine Open-Source-Unified-Analytics-Engine, die aufgrund ihrer Geschwindigkeit und Effizienz in Branchen wie Finanzen, Gesundheitswesen, Reisen, E-Commerce sowie Medien und Unterhaltung weit verbreitet ist. Spark deckt ein breites Spektrum an Arbeitslasten ab, wie z. B. Batch-Anwendungen, iterative Berechnungen, interaktive Abfragen und Streaming durch effizientes In-Memory-Cluster-Computing. Es bietet auch eine Reihe von High-Level-APIs (Java, Scala, Python und R) für die Anwendungsentwicklung.

 

Eine kurzer Rückblick auf die Anfänge von Spark

Spark wurde mit der Idee geboren, etwas Besseres als MapReduce zu entwickeln. MapReduce wurde ursprünglich von Google als Verarbeitungsmodell für die fehlertolerante Verarbeitung großer Datenmengen konzipiert und 2004 von den Nutch-Entwicklern als Open Source zur Verfügung gestellt, aus der die Hadoop-Toolfamilie hervorging.

Die Apache-Community erkannte schnell, dass die Implementierung von MapReduce und NDFS auch für andere Aufgaben verwendet werden kann. "Anstatt sich bei der Bereitstellung von Hochverfügbarkeit auf die Hardware zu verlassen, ist die Bibliothek selbst so konzipiert, dass sie Ausfälle auf der Anwendungsebene erkennt und behandelt und so einen hochverfügbaren Dienst auf einem Cluster von Computern bereitstellt, von denen jeder einzelne für Ausfälle anfällig sein kann." Apache Hadoop

Zum ersten Mal konnte eine breite Masse von Entwicklern rechenintensive Prozesse mit großen Datenmengen (Big Data, Petabyte-Bereich) auf Computerclustern durchführen. Hadoop ermöglichte verteiltes Rechnen und Replikation zu einem Bruchteil der üblichen Kosten mit einem extrem einfachen Rechenmodell. Unternehmen wie Yahoo und Facebook setzten MapReduce damals in großem Maßstab ein.

Doch trotz seiner Benutzerfreundlichkeit erwies sich MapReduce in vielerlei Hinsicht als unzureichend. Durch die Beschränkung auf zwei sehr statische Phasen (Map > Reduce) beschränkten sich die Anwendungsbereiche auf das Aufteilen, Sortieren und Zusammenführen. Es war ein einfaches Modell, das nur eine einfache Reduktion von Datensätzen erlaubte. Eine Umgehung dieser Beschränkungen erforderte eine Menge Schreibarbeit auf Hard Disks, was die Verarbeitungszeit sowie die Kosten in die Höhe trieb.

Darüber hinaus brauchte man Lösungen für komplexere Operationen und Funktionen wie Filter, Join Data, Aggregate, Fold oder Map. Die Beschränkung des MapReduce-Programmiermodells führte daher zur Einführung von ablauforientierten Frameworks wie Cascading, die zwar die Codierung, nicht aber die Ausführung verbesserten. Die reduzierte Ausgabe musste immer noch auf die Festplatte geschrieben werden. Dies war von Natur aus sehr langsam.

Dann kam Spark auf. Es wurde 2009 am AMPLab der UC Berkeley entwickelt und 2013 an Apache gespendet. Spark basiert auf dem Konzept der direkten Ausführung azyklischer Graphen und verbesserte somit das Laufzeitverhalten von MapReduce erheblich. Spark bietet viele nützliche Algorithmen für Data Mining, Datenanalyse, maschinelles Lernen und Algorithmen auf Graphen. Während MapReduce ein verarbeitungsorientiertes Framework ist, bietet Spark ein abstraktes Berechnungsmodell, das auf Read Only Data Structures (RDD), Dataframes/Datasets und iterativen Transformationen basiert. Mit RDDs können Sie eine azyklische Grafik von aufeinanderfolgenden Berechnungsschritten haben. RDDs ermöglichen eine Serialisierung und eine Berechnung im Speicher und müssen nicht wie bei MapReduce in jeder Phase auf die Festplatte geschrieben werden. Obwohl Spark vollständig in Scala entwickelt wurde, bietet es auch High-Level-APIs für Java, Python und R. Es läuft auf mehreren Clustertechnologien, namentlich Kubernetes, Mesos, YARN (Hadoop) und natürlich seinen eigenen Clustern.

 

Spark bietet vier zusätzliche APIs zusätzlich zum Spark-Core:

Spark ML

Die zunehmend beliebter werdende Spark ML ist eine spezielle Implementierung von Algorithmen für das verteilte maschinelle Lernen. Die Vielfalt ist nicht so groß wie im Python-Bereich mit den Python ML-Bibliotheken. Aber die wichtigsten sind vorhanden und es gibt einen großen Vorteil: Sie sind von Natur aus verteilt.

GraphX

Daneben gibt es GraphX, das eine API für die Nutzung von Graphen in einer schnellen und robusten Entwicklungsumgebung bietet. Es verwendet das Spark RDD-Konzept, um Aufgaben der Graphenanalyse zu vereinfachen und Operationen auf einem gerichteten Multigraphen zu ermöglichen, dessen Eigenschaften mit jedem Knoten und jeder Kante verknüpft sind.

Spark Streaming

Eine der wichtigsten Komponenten des Big Data-Ökosystems ist Spark Streaming. Es wurde 2013 zu Apache Spark hinzugefügt und ist eine Erweiterung der Spark-API, die eine skalierbare, durchsatzstarke und fehlertolerante Stream-Verarbeitung von Live-Datenströmen ermöglicht. Live-Eingabedatenströme werden von Spark Streaming empfangen und in Batches aufgeteilt. Diese Batches werden dann gepuffert und von der latenzoptimierten Spark-Engine verarbeitet, um die Ergebnisse an andere Systeme auszugeben.

SparkSQL

Zu guter Letzt gibt es mit SparkSQL eine Dataset-API mit SQL, die modernste SQL-Leistung bietet.

 

Das Spark-Framework

Spark kann sowohl für Stapelverarbeitung als auch für echtzeitnahe Verarbeitung verwendet werden. Das Apache Spark-Framework besteht aus einem Driver, dem Master-Node, und vielen Executors (Tasks oder Closures), die als Worker-Nodes im Cluster ausgeführt werden. Die Worker-Nodes kommunizieren über den Cluster-Manager mit dem Treiber, der wiederum mit dem Cluster Manager zusammenarbeitet, um verschiedene andere Aufgaben zu verwalten. Der Cluster-Manager wählt die verfügbaren Ressourcen (Worker Nodes) aus und unterteilt den Auftrag in mehrere kleinere Aufgaben, die dann auf die Worker Nodes verteilt werden.

Eine weitere Aufgabe des Treibers besteht darin, dafür zu sorgen, dass die einzelne Phasen abgeschlossen werden. Der Treiber überwacht und orchestriert jede einzelne Phase der Worker-Nodes und stellt sicher, dass die Aufgaben in Abstimmung mit dem Cluster-Manager richtig geplant werden. Dadurch ist Spark sehr widerstandsfähig. Wenn beispielsweise ein Worker ausfällt, verteilt der Treiber die gleiche Arbeitseinheit auf eine andere Node.

 

Spark RDDs

RDDs sind die grundlegende Datenstruktur in Spark. RDD steht dabei für "Resilient Distributed Data Set":

Resilient: Sollten Daten im Speicher verloren gehen, werden sie neu erstellt.

Distributed: Die Daten werden im Speicher des Clusters gespeichert.

DataSet: Die Ausgangsdaten stammen aus einer Datenquelle (Datei, Stream, etc.)

RDDs sind unveränderliche und unterteilte Sammlungen von Elementen. Die Daten werden aus einer Datenquelle kopiert. Spark wird immer versuchen, die Daten so weit wie möglich aufzuteilen, damit die Berechnungen parallel ausgeführt werden können. Es handelt sich immer um eine Sammlung verschiedener Elemente desselben Typs, die von Spark verarbeitet wird. Unter Verwendung von RDDs bietet Spark Transformations- (Map, Filter, ...) und Aggregationsoperationen (Reduce, Fold, ...) ähnlich wie bei Scala-Sammlungen. 

 

Spark DataFrames und DataSets

RDDs können Daten nicht auf optimierte und strukturierte Weise verarbeiten und ausgeben. An dieser Stelle kommen DataFrames und DataSets ins Spiel. DataFrames geben uns die Möglichkeit, Daten in benannten Spalten zu organisieren (ähnlich wie das Python-Panda-Framework). Wenn die Daten in einem tabellenähnlichen Format organisiert sind, können wir problemlos SQL-Befehle zum Ändern, Auswählen und Filtern der Daten ausführen. Der große Vorteil ist, dass der Katalysator von Spark Optimierungen unterstützt. Er verfügt über einen Ausführungsplan-Optimierer, der der Funktionsweise relationaler Datenbanken sehr ähnlich ist. In Verbindung mit spezifischen Formaten wie JSON, Parquet, CSV spart Spark Ressourcen, die für die Abfrage erforderlich sind, indem es die Datenstruktur optimiert oder die Daten in der Map-Phase mit Hilfe von Prädikaten-Pushdown filtert.

DataSets sind eine Erweiterung von DataFrames. Sie sind statische typisierte DataFrames und kombinieren so die Flexibilität von DataFrames mit der Leistungsfähigkeit von Types in Scala. DataSets sind im Gegensatz zu DataFrames standardmäßig eine Sammlung von stark typisierten JVM-Objekten. Außerdem nutzen sie den auf der funktionalen Programmierung von Scala basierenden SQL-Optimierer, den Spark Catalyst (für weitere Informationen zu diesem Thema hier klicken: https://blog.bi-geek.com/en/spark-sql-optimizador-catalyst/). Um das Ganze verständlicher zu machen: Ein DataFrame ist ein DataSet vom Typ Row, wodurch eine elegante Brücke zwischen diesen Python-Konzepten und Scala geschlagen wird.

DataFrames sind in die Spark ML-Bibliothek integriert. Anstatt also RDDs zu haben, die in ein Tabellenformat konvertiert werden müssen, kann man im Grunde nur einen DataFrame nehmen und dann den Algorithmus für maschinelles Lernen auf den DataFrames ausführen, was die Ausführung viel einfacher und pythonesker macht. Für jeden in der funktionalen Programmierwolke mag das wie eine Beleidigung klingen, aber es ist tatsächlich ein sehr bequemer Weg, diese ML-Algorithmen zu erzeugen und zu verwenden. Oft können Beispiele aus Pandas einfach von Python auf Spark übertragen werden, um eine Vorstellung davon zu bekommen, wie bestimmte Dinge funktionieren. Und natürlich bieten DataFrames und insbesondere die statisch typisierten DataSets auch eine ansehnliche Menge an funktionalen Transformationen wie map, flatMap, filter, etc.

 

Datenquellen

Spark kann Daten von so ziemlich allem und überall lesen und in alles zurückschreiben:

Dateien: HDFS, S3, Google Buckets als JSON, XML, Parquet, ORC, CSV

Streams: JMS, Twitter, Kinesis, Kafka

Datenspeicher: Elastic Search, Cassandra, RDBMs (JDBC)

Spark bietet eine Schema-Erkennung, um Datentypen zu erkennen. Es unterstützt auch die Verwendung von Case Classes. Gängige Dateiformate können automatisch in Case Classes und DataSets konvertiert werden.

 

Testing & Coding

Testgetriebene Entwicklung ist mit Spark möglich und wir empfehlen jedem (grundsätzlich), diese Option zu nutzen. Spark bietet Ihnen die Möglichkeit, Ihre Anwendungsumgebung zu wählen und Clustertypen wie Kubernetes, YARN, Mesos oder Spark Standalone per Konfiguration zu ändern. Der Local-Modus ermöglicht es Ihnen, Ihre Spark-Anwendung auf lokaler Ebene auszuführen.

 

Kurz Zusammengefasst:

Spark beseitigt den Aufwand für die Verarbeitung und Verteilung großer Datenströme. Es vereinfacht Dinge wie das Lesen und Schreiben von verschiedenen Datentypen oder den Umgang mit verteilter Datenverarbeitung. So können Sie sich ganz auf Ihre Anwendung konzentrieren, mit Datenstrukturen, die den Sammlungen in Scala oder der Java Stream API ähneln. Sie genießen die Vorteile einfacher Evaluationsmöglichkeiten und der Laufzeitoptimierung, die Spark so beliebt und MapReduce weit überlegen machen.

 

Spark einfach mal ausprobieren:

Wir stellen allen Interessierten ein Trainingsrepository mit Übungen und Lösungsteilen zur Verfügung . Viel Spaß beim Testen! 

Link zum Trainingsrepository: https://github.com/HivemindTechnologies/spark-workshop

Apache Spark Logo