Definition: Apache Spark

Apache Spark ist ein Open-Source-Framework für die schnelle und universelle Verarbeitung großer Datenmengen.

Es bietet eine einheitliche Analyse-Engine für Big Data und unterstützt sowohl Batch- als auch Streaming-Verarbeitungsmodelle.

Dabei kann Spark als Erweiterung eines Hadoop Clusters und dort als Alternative zu Hadoop MapReduce betrieben werden, kann jedoch auch unabhängig von Hadoop eingesetzt werden.

Anders als in Hadoop werden die Daten in Spark erst nach Abschluss der Map-Schritte persistiert. Das bedeutet aber auch, das Spark im Default keinen Cache der Daten vorhält.

Anmerkung

Spark Ökosystem

Ähnlich wie Hadoop bietet Spark ein (wenn auch kleineres) Ökosystem an Erweiterungen:

Definition: Shuffling und Repartition

Wie bei Hadoop MapReduce gibt es bei Spark (aufwendige) Shuffling-Schritte, bei denen die Daten nach Key zusammengeführt werden, bspw. bei dem Task groupByKey.

Diese Repartitionierungsschritte können jedoch auch nützlich sein, bspw. wenn nach einem Filter-Schritt nur noch wenige Datensätze eines Keys auf einer Node vorhanden sind.

Beispielhaftes Spark Programm

Als beispielhaftes Spark Programm, hier die Zählung aller Studierenden nach Fakultät, wobei folgendes CSV gegeben sei:

<data.csv>
 
studentA;Hagen;Psychology
studentB;Frankfurt;Law
studentC;Hagen;Computer Science
studentD;Berlin;Law
...

Lesen, filtern und verarbeiten können wir die Daten nun wie folgt:

# Spark Session starten
spark = SparkSession.builder \
.master("yarn") \
.appName("ApplicationName") \
.getOrCreate() 
 
sc = spark.sparkContext
 
data = sc.textFile("path/to/data.csv")
# data: ["studentA;Hagen;Psychology", "studentB;Frankfurt;Law", …]
 
students = data.map(lambda line: line.split(";"))
# students: [ ["studentA", "Hagen", "Psychology"], ["studentB", "Frankfurt", "Law"], …]
 
hagen = students.filter(lambda student: student[1]=="Hagen")
 
#hagen: [ ["studentA", "Hagen", "Psychology"], ["studentC", "Hagen", "Computer Science"], …]
 
tuples = hagen.map(lambda student: (student[2], 1))
# tuples: [ ("Psychology", 1), ("Computer Science", 1) , …]
 
result = tupels.reduceByKey(lambda x, y: x + y)
# result: [ ("Psychology", 121), ("Computer Science", 212), …]
 
result.collect()