Was ist Apache Spark?

04.04.2023
Von 
Ian Pointer ist Senior Big Data und Deep Learning Architect. Er beschäftigt sich vor allem mit Apache Spark und PyTorch und schreibt für unsere US-Schwesterpublikation Infoworld.com.
Apache Spark ist die führende Big-Data-Plattform. Lesen Sie, warum.
Apache Spark hat Hadoop als führende Plattform in Sachen Big Data abgelöst. Lesen Sie, worin sich ihr Erfolg begründet.
Apache Spark hat Hadoop als führende Plattform in Sachen Big Data abgelöst. Lesen Sie, worin sich ihr Erfolg begründet.
Foto: VectorMine - shutterstock.com

Seit seinen bescheidenen Anfängen im AMPLab der U.C. Berkeley im Jahr 2009 hat sich Apache Spark zu einem der wichtigsten verteilten Big-Data-Verarbeitungs-Frameworks der Welt entwickelt. Dabei lässt sich Spark auf vielfältige Weise einsetzen und bietet native Anbindungen beziehungsweise Support für:

Apache Spark wird von Banken, Telekommunikationsunternehmen, Gaming-Unternehmen, Regierung(sinstitutionen) und allen großen Tech-Playern wie Apple, IBM, Meta und Microsoft verwendet.

Apache Spark definiert

Apache Spark ist ein Data-Processing-Framework, das sehr große Datensätze schnell verarbeiten und entsprechende Tasks auf mehrere Rechner verteilen kann - entweder im Alleingang oder im Zusammenspiel mit anderen, Tools für Distributed Computing.

Diese beiden Eigenheiten sind der Schlüssel zu Big Data und maschinellem Lernen, die massive Rechenleistung erfordern. Mit seiner benutzerfreundlichen API, die das Gros der Routineaufgaben der verteilten Datenverarbeitung abstrahiert, kann Apache Spark Softwareentwicklern das Leben leichter machen.

Spark RDD

Das Konzept des Resilient Distributed Dataset (RDD) bildet das Herzstück von Apache Spark. Diese Programmierabstraktion repräsentiert eine unveränderliche Sammlung von Objekten, die über ein Rechen-Cluster verteilt werden können. Operationen auf den RDDs können auch in einem parallelen Batch-Prozess ausgeführt werden, was zu einer schnellen und skalierbaren, parallelen Verarbeitung führt. Apache Spark wandelt die Datenverarbeitungsbefehle der Benutzer in einen gerichteten azyklischen Graph (Directed Acyclic Graph, DAG) um. Dieser bildet die Planungsschicht von Apache Spark und bestimmt darüber, welche Tasks auf welchen Knoten und in welcher Reihenfolge ausgeführt werden.

RDDs können unter anderem erstellt werden aus:

  • einfachen Textdateien,

  • SQL-Datenbanken,

  • NoSQL-Speichern (wie Cassandra und MongoDB), oder

  • Amazon S3-Buckets.

Ein Großteil der Spark-Kern-API basiert auf diesem RDD-Konzept und ermöglicht herkömmliche Map- und Reduce-Funktionen, bietet aber auch integrierten Support um Datensätze zu:

  • verbinden,

  • filtern,

  • samplen und

  • aggregieren.

Spark wird verteilt ausgeführt: Ein Driver-Kernprozess teilt Spark-Applikationen in Tasks auf und verteilt diese auf mehrere Executor-Prozesse, die diese abarbeiten. Je nach den Anforderungen der Anwendung lassen sich diese Executors nach oben oder unten skalieren.

Spark SQL

Spark SQL hat für das Apache-Spark-Projekt zunehmend an Bedeutung gewonnen und ist heute das Interface, dass am häufigsten verwendet wird, um Anwendungen zu erstellen. Spark SQL konzentriert sich auf die Verarbeitung strukturierter Daten, wobei ein aus R und Python (in Pandas) entlehnter Dataframe-Ansatz verwendet wird. Dabei bietet Spark SQL auch eine SQL2003-konforme Schnittstelle, um Daten abzufragen.

Daneben bietet Spark SQL ein Standard-Interface, um Read- und Write-Operationen in anderen Datastores auszuführen. Standardmäßig unterstützt werden etwa:

  • JSON,

  • HDFS,

  • Apache Hive,

  • JDBC,

  • Apache ORC und

  • Apache Parquet.

Andere beliebte Optionen wie Apache Cassandra, MongoDB, Apache HBase und weitere lassen sich über separate Konnektoren aus dem Spark-Packages-Ökosystem einbinden. Spark SQL erlaubt darüber hinaus die transparente Nutzung von User-Defined Functions (UDFs) innerhalb von Abfragen. Einige Spalten eines Dataframe auszuwählen, gestaltet sich simpel:

citiesDF.select("name", "pop")

Mit Hilfe der SQL-Schnittstelle registrieren wir den Dataframe als temporäre Tabelle und können anschließend SQL-Abfragen auf ihn anwenden:

citiesDF.createOrReplaceTempView("cities")

spark.sql("SELECT name, pop FROM cities")

Unter der Haube nutzt Apache Spark einen Query Optimizer namens Catalyst. Dieser untersucht Daten und Abfragen, um einen effizienten Abfrageplan für Datenlokalität und Computation zu erstellen, der die nötigen Berechnungen im gesamten Cluster durchführt.

Seit Apache Spark Version 2.x ist die Spark-SQL-Schnittstelle für Dataframes und Datasets (im Wesentlichen ein typisierter Datenrahmen, der zur Kompilierzeit auf Korrektheit geprüft werden kann und zur Laufzeit weitere Speicher- und Berechnungsoptimierungen nutzen kann) der empfohlene Entwicklungsansatz. Das RDD-Interface ist nach wie vor verfügbar, wird aber nur für den Fall empfohlen, dass die Anforderungen nicht innerhalb des Spark-SQL-Paradigmas erfüllt werden können (etwa, wenn Sie auf einer niedrigeren Ebene arbeiten müssen, um das letzte Quäntchen Performanz aus dem System zu quetschen).

Spark MLlib und MLflow

Um Machine-Learning-Techniken und Graphenanalyse auf Daten in großem Umfang anzuwenden, bündelt Apache Spark Bibliotheken.

  • MLlib enthält ein Framework, um Machine-Learning-Pipelines aufzubauen und vereinfacht es so, Feature Extraction, Selections und Transformations auf strukturierte Datensätze anzuwenden. MLlib enthält verteilte Implementierungen von Clustering- und Klassifizierungsalgorithmen wie k-means Clustering und Random Forests, die problemlos in benutzerdefinierte Pipelines ein- und ausgelagert werden können. Modelle können von Datenwissenschaftlern in Apache Spark mit R oder Python trainiert, mit MLlib gespeichert und dann in eine Java- oder Scala-basierte Pipeline für den Produktionseinsatz importiert werden.

  • MLflow ist eine Open-Source-Plattform, um den Machine-Learning-Lifecycle zu managen - ist allerdings rein technisch betrachtet kein Teil des Apache-Spark-Projekts. Die Community hat die Integration von MLflow in Apache Spark vorangetrieben, um MLOps-Funktionen wie Experiment Tracking, Mode3l Registries, Packaging und UDFs zu realisieren, die mit herkömmlichen SQL-Anweisungen importiert werden können.

Structured Streaming

Structured Streaming ist eine High-Level-API, die es Entwicklern ermöglicht, unendliche Streaming-Datenframes und -Datensätze zu erstellen. Mit Spark 3.0 löste Structured Streaming "Spark Streaming" als empfohlene Methode ab, um Streaming-Daten in Apache Spark zu verarbeiten. Alle Abfragen auf strukturierte Streams durchlaufen den Catalyst-Query-Optimizer und können sogar interaktiv ausgeführt werden - ermöglichen also SQL-Abfragen auf Live-Streaming-Daten.

In Spark 3.1 und höher können Sie Streams als Tabellen und Tabellen als Streams behandeln. Die Möglichkeit, mehrere Streams mit einer breiten Palette von SQL-ähnlichen Stream-to-Stream-Joins zu kombinieren, schafft leistungsstarke Ingestions- und Transformationsmöglichkeiten. Im Folgenden ein einfaches Beispiel, um eine Tabelle aus einer Streaming-Quelle zu erstellen:

val df = spark.readStream

.format("rate")

.option("rowsPerSecond", 20)

.load()

df.writeStream

.option("checkpointLocation", "checkpointPath")

.toTable("streamingTable")

spark.read.table("myTable").show()

Structured Streaming verwendet standardmäßig ein Micro-Batching-Schema, um Streaming-Daten zu verarbeiten. Seit Version 2.3 ergänzt ein Continuous-Processing-Modus mit niedriger Latenz das Structured Streaming. Das ermöglicht es, Antworten mit beeindruckenden Latenzzeiten von einer Millisekunde zu verarbeiten - und rückt Apache Spark auf Augenhöhe mit Konkurrenzangeboten wie Apache Flink und Apache Beam.

Continuous Processing beschränkt sich auf Map-ähnliche und Auswahloperationen: Obwohl SQL-Abfragen in Streams unterstützt werden, gibt es derzeit keinen Support für SQL-Aggregationen. Davon abgesehen ist auch nicht unwichtig, dass Continuous Processing - obwohl bereits im Jahr 2018 eingeführt - auch im März 2023 noch als "experimentell" gekennzeichnet wird.

Geht es um die Apache-Spark-Plattform, ist Structured Streaming die Zukunft von Streaming-Anwendungen. Wenn Sie also eine neue Streaming-Anwendung erstellen, sollten Sie Structured Streaming verwenden. Die alten Spark-Streaming-APIs werden weiterhin unterstützt, sind aber nicht empfohlen.

Delta Lake

Ähnlich wie MLflow ist auch Delta Lake rein technisch gesehen ein separates Projekt. Im Laufe der letzten Jahre hat sich Delta Lake jedoch zu einem integralen Bestandteil des Spark-Ökosystems entwickelt - und bildet den Kern dessen, was Databricks "Lakehouse-Architektur" nennt.

Delta Lake erweitert Cloud-basierte Data Lakes um ACID-Transaktionen, eine einheitliche Abfragesemantik für Batch- und Stream-Verarbeitung sowie ein Schema Enforcement. Das macht ein separates Data Warehouse für BI-User überflüssig. Eine vollständige Audit History und Skalierbarkeit, um Daten in Exabyte-Dimensionen zu verarbeiten, sind ebenfalls Teil des Pakets.

Das Delta-Lake-Format zu nutzen, gestaltet sich dabei ähnlich einfach wie im Fall des delta-Formats:

df = spark.readStream.format("rate").load()

stream = df

.writeStream

.format("delta")

.option("checkpointLocation", "checkpointPath")

.start("deltaTable")

Pandas-API auf Spark

Der Industriestandard für Datenmanipulation und -analyse in Python ist die Pandas-Bibliothek. Mit Apache Spark 3.2 wurde eine neue API bereitgestellt, die es ermöglicht, einen großen Teil der Pandas-API transparent mit Spark zu verwenden.

Jetzt können Datenwissenschaftler ihre Importe einfach mit import pyspark.pandas as pd ersetzen und sich einigermaßen sicher sein, dass ihr Code weiterhin funktioniert und auch die Vorteile der Multi-Node-Execution nutzt. Der Support für die Pandas-API soll in Zukunft weiter ausgebaut werden.

Apache Spark ausführen

Grundsätzlich besteht eine Apache-Spark-Anwendung aus zwei wesentlichen Komponenten:

  • einem Driver, der den Code des Benutzers in mehrere Tasks umwandelt, die auf Worker Nodes verteilt werden können und

  • Executors, die auf diesen Knoten laufen und die ihnen zugewiesenen Aufgaben ausführen.

Um zwischen diesen beiden Komponenten zu vermitteln, ist eine Art Cluster-Manager notwendig. Apache Spark kann standardmäßig in einem eigenständigen Cluster-Modus ausgeführt werden. Dieser erfordert lediglich das Apache-Spark-Framework und eine Java Virtual Machine auf jedem Knoten im Cluster. Es ist jedoch wahrscheinlich, dass Sie die Vorteile eines robusteren Ressourcen- oder Cluster-Management-Systems nutzen möchten.

In Unternehmen bedeutete das in der Vergangenheit, auf Hadoop YARN auszuweichen. Da Hadoop jedoch immer weniger etabliert ist, haben sich immer mehr Unternehmen dafür entschieden, Apache Spark auf Kubernetes bereitzustellen. Das spiegelt sich auch in den Apache Spark 3.x-Versionen wider, die die Integration mit Kubernetes optimieren (einschließlich der Möglichkeit, Pod-Vorlagen für Driver und Executors zu definieren und benutzerdefinierte Scheduler wie Volcano zu verwenden).

Wenn Sie eine verwaltete Lösung suchen, finden Sie Apache-Spark-Angebote auf allen drei großen Cloud-Plattformen:

Apache-Spark-Tutorials

Wenn Sie jetzt bereit sind für einen Deep Dive in Sachen Apache Spark, haben wir einige Ressourcen für Sie zusammengestellt, die Sie dabei unterstützen:

(fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.