Was man beim Einsatz von Spark beachten sollte

Im Zuge von Analyse Projekten im Big Data Umfeld wird auch bei uns immer häufiger Apache Spark als Framework zur parallelen Bearbeitung von großen Datenmengen verwendet. Dabei haben sich einige Erkenntnisse herauskristallisiert, die wir gerne mit euch teilen wollen.

Die Architektur von Spark

Spark ist darauf ausgelegt, in einem Computer Cluster sehr große Datenmengen zu koordinieren und effizient zu verarbeiten. Dabei kümmert sich Spark um die Verteilung der Daten im Cluster. Damit einhergeht eine spezielle Architektur, die man beim Einsatz von Spark im Kopf haben muss. Jede Spark Anwendung besteht aus folgenden wesentlichen Komponenten:

  • Driver Process: verwaltet Informationen über die Spark Anwendung und verteilt die Arbeit im Cluster auf die Executors
  • Executors: führt den Code aus und gibt Statusinformationen an den Driver zurück
  • Cluster Manager: verwaltet das Cluster, also die Maschinen (= Computer), auf denen der Driver Process sowie die Executors laufen.
    Die Architektur einer Spark-Applikation
    Die Architektur einer Spark-Applikation (in Anlehnung an MyNotes)

Die von Spark verwalteten Daten werden partitioniert und dann für die einzelnen Verarbeitungsschritte im Cluster verteilt. Daher gibt es bei der Entwicklung mit Spark zahlreiche Fallstricke, die man beachten sollte.

Besonderheiten von Spark: Wichtig zu wissen bei der Implementierung

 
Die vorher beschriebene Architektur muss man zwingend bei der Implementierung im Hinterkopf haben. Was passieren kann, wenn man dies nicht tut, kann man gut anhand der foreach Methode der Klasse Dataset sehen. Diese Methode ist nur für den Einsatz von Akkumulatoren, d.h. atomare Zähloperationen, ausgelegt. Falls man anderweitige Operationen ausführt, kann das gegebenenfalls zu einem unerwarteten Verhalten führen. Ein Beispiel aus der Spark Doku, wie man es nicht machen sollte, sieht wie folgt aus:Code Snippet 1 Spark Danny Claus

Darüber hinaus ist man bei Datenaufbereitung und -manipulationen zunächst mal in der Spark Welt gefangen und muss die von der API bereitgestellten Funktionen nutzen. Will man daraus ausbrechen (z.B. weil eine bestimmte Operation nicht zur Verfügung steht), dann muss man sehr genau überlegen, welchen Impact das hat. So kann man beispielsweise bei der Umwandlung eines Datasets in eine (java.util.) Collection leicht in ein Speicherproblem laufen:Code Snippet 2 Spark Danny Claus

Bei großen Datenmengen kann hier ein OOM entstehen.

Erschwerend kommt hinzu, dass die Dokumentation von Spark in Teilen noch unausgereift ist. So befindet sich beispielsweise die Java-Doc noch im Aufbau.
Auch die Dokumentation zu einzelnen Machine Learning Verfahren lässt hier an einigen Stellen noch zu wünschen übrig.
Ebenfalls ist die DataFrame API noch relativ neu. Folglich findet man im Großteil der Literatur sowie im Netz Beispiele, die noch auf der RDD-based API basieren.

Konfiguration und Infrastruktur von Spark

Neben den gewählten Implementierungsansätzen hat die Konfiguration der Spark-Umgebung sowie der zugehörigen Infrastruktur große Auswirkung auf die jeweilige Anwendung.

Spark kann in drei verschiedenen Modes laufen:

  • Local mode: Die gesamte Spark-Anwendung läuft auf einer einzelnen Maschine (nicht im Cluster). Dieser Mode ist geeignet für die Entwicklung. Für die Verwendung in einer produktiven Umgebung ist dieser Mode nicht vorgesehen.
  • Client Mode: Executors Prozesse laufen im Cluster. Der Driver Prozess läuft auf der Client Maschine, die Spark gestartet hat.
  • Cluster Mode: Driver und Executor Prozesse laufen im Cluster.

 

Je nach Modus und dahinter liegender Infrastruktur hat die jeweilige Konfiguration einen ganz wesentlichen Einfluss auf die Performance der Anwendung. Wichtige Parameter sind beispielsweise die Anzahl der verwendbaren Rechenkerne (spark.core.max), der Speicher, der für die Driver (spark.driver.memory) und Executor (spark.executor.memory) zur Verfügung steht oder die Anzahl der parallelen Threads (spark.default.parallelism und spark.default.parallelism). Zu empfehlen ist die Nutzung der spark-defaults.conf (und nicht via Code), da einige Attribute, nur wirksam werden, wenn sie hier konfiguriert sind.

Grundsätzlich gilt: Spark ist sehr ressourcenhungrig. Daher kann Spark seine Stärken nur ausspielen, wenn wirklich große Datenmengen mit einer entsprechenden Infrastruktur (mehrere Nodes die jeweils mehrere Cores und viel RAM verfügbar haben) vorliegen.

In der Regel ist Spark in ein Ecosystem verschiedener Technologien eingebettet, z.B. HDFS, Hive, Docker, etc.. Dieses Zusammenspiel führt zu einer hohen Komplexität der jeweiligen Projekte. Man muss also ein entsprechendes Know-how in einer Vielzahl unterschiedlicher Technologien haben, um ein Projekt mit Apache Sparks effizient und erfolgreich umsetzen zu können.

Fazit

Spark ist ein Framework für Cluster-Computing, das für die Verarbeitung sehr großer Datenmengen ausgelegt ist. Bildlich gesprochen ist es ein großer Dampfer, der nur mit vielen Passagieren (= Daten) und geeigneten Rahmenbedingungen (= Infrastruktur) seine volle Stärke ausspielen kann. Daher ist es in jedem Fall sinnvoll, vor dem Einsatz den jeweiligen Anwendungsfall zu prüfen, ob Spark die geeignete Technologie ist oder ob nicht vielleicht eine andere eingesetzt werden sollte.

 

Mehr zu Big Data und Maschine Learning Technologien

Quellen:

https://izhangzhihao.github.io/2018/04/01/Spark-The-Definitive-Guide-In-Short/

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*Pflichtfelder

*