Im ersten Teil der Grundlagen wurde zunächst das Thema Big Data Analytics im Allgemeinen behandelt, wir haben Begriffe definiert und die entsprechenden Frameworks Apache Hadoop und Apache Spark vorgestellt. Da diese Blogreihe speziell Big Data Analytics mit Apache Spark zum Thema hat, wurden anschließend die einzelnen Bestandteile dieses modernen In-Memory-Frameworks beleuchtet.
Im zweiten Teil geht es nun um erste praktische Erfahrungen im Umgang mit Spark. Sie sollten hier keine Scheu haben, die gezeigten Beispiele selbst auszuprobieren und zu variieren. Die gezeigten Beispiele wurden auf einem Macbook Pro lokal ausgeführt, sind aber auch auf Linux und Windows-Maschinen nachvollziehbar. Dies soll aber verdeutlichen: das Kennenlernen von Spark erfordert bei Weitem kein Rechenzentrum und auch mit einer Single-Node Maschine können schon wichtige Erkenntnisse aus einer Datenanalyse entstehen.
Bevor wir starten, hier nun noch einige grundlegende Hinweise:
Sollten Sie Spark auf einer Windows-Maschine ausprobieren wollen, empfehle ich dringend die Installation in einer Virtual Machine (z.B. mit Virtualbox) auf einem Linux-Derivat Ihrer Wahl. Eine mögliche Alternative für schwächere Systeme ist die native Installation unter Windows mit einer Linux-ähnlichen Shell (hier ist vor allem Cygwin bekannt). Die Shell von Spark, die sogenannte REPL (Read Eval Print Loop) von Scala oder Python, ist zwar betriebssystemunabhängig, die Beispiele zum Starten von Skripten, die Verzeichnisnavigation und ähnliches sind jedoch meist Linux-annotiert.
Auf Linux, oder bedingt auch auf OS X empfehle ich den Einsatz von Docker-Containern für die Installation von Spark. Hierzu haben wir einen gesonderten Blog-Post vorgesehen.
Prinzipiell sind erste Gehversuche mit Spark sehr einfach, wie wir gleich sehen werden.
Im ersten Schritt laden Sie die entsprechenden Spark-Pakete von den vorgeschlagenen Download-Mirrors herunter. Unter http://spark.apache.org/downloads.html bekommen Sie den jeweils aktuellen stabilen Release von Spark angeboten. Dies ist zum Zeitpunkt der Artikelerstellung die Version 1.5.0. Allerdings sind die Änderungen zwischen den einzelnen Releases im Rahmen dieser Übungen nicht besonders groß und so können Sie diese ohne bedenken mit älteren oder neueren Versionen ausprobieren. Sollten Sie schon erste (oder auch tiefere) Erfahrungen mit Apache Hadoop gesammelt haben und ist dieses noch auf Ihrem System vorhanden, können Sie bei der Auswahl des Downloads eine Version wählen, die keine eigene Hadoop-Version mitbringt. In diesem Fall müssen auf Ihrem System die entsprechenden Umgebungsvariablen gesetzt sein (HADOOP_HOME) und Spark greift auf die vorhandene Version zu. Ist bisher keine Hadoop-Installation auf dem Zielsystem vorhanden, so wählen Sie bitte im Dropdown-Menü am Besten das Paket mit der neuesten Hadoop-Version aus (derzeit 2.6).
Wenn das Paket heruntergeladen wurde, kann es einfach entpackt und an eine beliebige Stelle kopiert werden.
Wenn in Ihrem System die entsprechenden Systemvariablen für die JVM und Scala richtig gesetzt sind, lässt sich Spark mit dem Aufruf
./bin/spark-shell
starten und die REPL meldet sich nach einiger Zeit mit einem Prompt wie unten dargestellt.
Die Warnmeldungen haben keinen Einfluss auf die Funktionsfähigkeit und können für die folgenden Übungen ignoriert werden.
Von dieser Konsole aus können Sie nun erste Beispiele in Spark ausführen. Da es sich um die Standard-REPL von Scala handelt, lassen sich hier auch Variablen vordefinieren und ganze Kontrollstrukturen realisieren. Besonders zur Echtzeitanalyse von Datenströmen ist die REPL ein interessantes Testwerkzeug.
Eine erste kleine Übung über die REPL: wir legen ein Textfile an, nennen es “test.txt” und speichern es im Hauptpfad der entpackten Spark-Distribution. Im Falle von Spark 1.5 mit Hadoop 2.6 ist dies also ../spark-1.5.0-bin-hadoop2.6/ .
Für dieses Beispiel habe ich ein Textfile mit 48 Zeilen aus einem Thesaurus erstellt.
Nun lassen wir Spark das Textfile einlesen und in ein so genanntes RDD (Resilient Distributed Dataset) speichern. Zum Thema RDD wird hier später noch ein separater Blog-Post veröffentlicht. Kurz gesagt sind RDDs die internen Datenstrukturen von Spark. Sie heißen resilient, weil sie bei Ausfall eines Knotens oder sonstigen technischen Problemen ohne weiteres wieder aufgebaut werden können. Der Spark Master-Node merkt sich hierfür nur die internen Regeln zum Aufbau des RDD. RDDs können entweder so groß sein, dass sie innerhalb des RAMs des jeweiligen Nodes Platz haben, oder aber teilweise auf Festspeicher (HDD, SSD) persistiert werden. Dieses Verhalten wird Spilling genannt.
Mit der Anweisung val textFile = sc.textFile(“test.txt”) wird zunächst eine innerhalb der laufenden REPL-Instanz gültige Variable “textFile” erzeugt. Dieser wird der Inhalt der Datei “test.txt” zugeordnet. “sc” bedeutet hier SparkContext. Dieser stellt eine Referenz zu Spark her. Wird Spark innerhalb von eigenen Programmen genutzt, wird dieser SparkContext explizit angefordert und deklariert. Innerhalb der REPL steht immer schon “sc” als Default-SparkContext zur Verfügung.
Nun kommt eine erste, sehr simple Analyse. Wir wollen wissen, aus wie vielen Elementen unser erzeugtes RDD besteht. Die Elemente sind, wenn nichts anderes definiert wurde, die Anzahl der Zeilen.
Wie man sieht, hat Spark die Datei richtig in ein RDD umgewandelt und eine korrekte Zeilenanzahl ausgegeben.
Als letzte kleine Übung in diesem First-Steps-Tutorial filtern wir unser RDD noch nach Wortvorkommen. In der oben dargestellten Beispieldatei kommt das Wort “sich” häufiger vor. Wir wollen wissen, in wie vielen Zeilen genau. Hierzu nutzen wir die Filter wie folgt:
val linesWithSich = textFile.filter(line => line.contains(“sich”)) erzeugt ein neues RDD mit den gefilterten Ergebnissen der Abfrage.
linesWithSich.count() gibt wie oben wieder die Anzahl der Elemente, also der Zeilen an, die das Wort “sich” beinhalten.
Wie im Screenshot zu erkennen ist, handelt es sich um genau 11 Zeilen aus dem ursprünglichen RDD.
Dieses kleine Tutorial sollte helfen, die Scheu vor Big-Data-Technologien zu verlieren und zu merken, wie simpel zumindest die ersten Schritte mit Spark sind.
In den nächsten Beiträgen dieser Reihe gehen wir einen Schritt weiter und lernen den Map/Reduce-Algorithmus, auf dem Hadoop und (in Teilen) auch Spark basieren, in kleinen, anschaulichen Praxisbeispielen kennen.
Leave a Comment