MapReduce
Was ist MapReduce?
MapReduce ist ein Java-basiertes, verteiltes Ausführungsframework innerhalb des Apache-Hadoop-Ökosystems. Es verringert die Komplexität der verteilten Programmierung, indem es zwei Verarbeitungsschritte offenlegt, die Entwickler implementieren: 1) Map und 2) Reduce. In der Map-Phase werden die Daten zwischen parallelen Verarbeitungs-Tasks aufgeteilt. Transformationslogik kann auf jeden Datenblock angewendet werden. Nach Abschluss übernimmt die Reduce-Phase die Verarbeitung der Daten aus der Map-Phase. Im Allgemeinen verwendet MapReduce das Hadoop Distributed File System (HDFS) sowohl für die Eingabe als auch für die Ausgabe. Einige darauf aufbauende Technologien wie Sqoop ermöglichen jedoch den Zugriff auf relationale Systeme.
Geschichte von MapReduce
MapReduce wurde 2004 von Google eingeführt und von Jeffery Dean und Sanjay Ghemawat von Google entwickelt (Dean & Ghemawat, 2004). In ihrem Artikel „MAPREDUCE: SIMPLIFIED DATA PROCESSING ON LARGE CLUSTERS“ ließen sie sich von den Map- und Reduce-Funktionen inspirieren, die häufig in der funktionalen Programmierung verwendet werden. Damals basierte Googles proprietäres MapReduce-System auf dem Google File System (GFS). Ab 2014 verwendete Google MapReduce nicht mehr als primäres Verarbeitungsmodell für Big Data. MapReduce war einst die einzige Methode, mit der die im HDFS gespeicherten Daten abgerufen werden konnten, aber das ist nicht mehr der Fall. Heutzutage gibt es andere Abfragesysteme wie Hive und Pig, die zum Abrufen von Daten aus dem HDFS mithilfe von SQL-ähnlichen Anweisungen verwendet werden, die zusammen mit Jobs ausgeführt werden, die mit dem MapReduce-Modell geschrieben werden.
Wie funktioniert MapReduce?
Ein MapReduce-System besteht normalerweise aus drei Schritten (obwohl es als Kombination von Map- und Reduce-Vorgängen/-Funktionen verallgemeinert wird). Die MapReduce-Vorgänge sind:
- Map: Die Eingabedaten werden zunächst in kleinere Blöcke aufgeteilt. Das Hadoop-Framework entscheidet dann, wie viele Mapper verwendet werden sollen, basierend auf der Größe der zu verarbeitenden Daten und dem auf jedem Mapper-Server verfügbaren Speicherblock. Jeder Block wird dann einem Mapper zur Verarbeitung zugewiesen. Jeder Worker-Knoten wendet die Map-Funktion auf die lokalen Daten an und schreibt die Ausgabe in den temporären Speicher. Der primäre (Master-)Knoten stellt sicher, dass nur eine einzige Kopie der redundanten Eingabedaten verarbeitet wird.
- Mischen, kombinieren und partitionieren: Worker-Knoten verteilen Daten basierend auf den Ausgabe-Keys (erzeugt von der Map-Funktion) neu, sodass sich alle zu einem Key gehörenden Daten auf demselben Worker-Knoten befinden. Als optionaler Prozess kann der Combiner (ein Reducer) einzeln auf jedem Mapper-Server ausgeführt werden, um die Daten auf jedem Mapper noch weiter zu reduzieren, wodurch der Datenbedarf reduziert und das Mischen und Sortieren einfacher wird. Partitionieren (nicht optional) ist der Prozess, der entscheidet, wie die Daten dem Reducer präsentiert werden müssen, und der sie auch einem bestimmten Reducer zuweist.
- Reduzieren: Ein Reducer kann nicht gestartet werden, während ein Mapper noch ausgeführt wird. Worker-Knoten verarbeiten jede Gruppe von <key,value>-Paar-Ausgabedaten parallel, um <key,value>-Paare als Ausgabe zu erzeugen. Alle Map-Ausgabewerte, die denselben Key haben, werden einem einzelnen Reducer zugewiesen, der dann die Werte für diesen Key aggregiert. Im Gegensatz zur Map-Funktion, die zum Filtern und Sortieren der Ausgangsdaten obligatorisch ist, ist die Reduce-Funktion optional.
Welche Überlegungen gibt es bei MapReduce?
Rigides MapReduce-Programmierparadigma
Während die Bereitstellung von Map- und Reduce-Schnittstellen für Programmierer die Erstellung verteilter Anwendungen in Hadoop vereinfacht hat, ist es schwierig, ein breites Spektrum an Logik in einem Map-Reduce-Programmierparadigma auszudrücken. Der iterative Prozess ist ein Beispiel für Logik, die in MapReduce nicht gut funktioniert. Im Allgemeinen werden Daten nicht im Speicher gehalten und die iterative Logik wird durch die Verkettung von MapReduce-Anwendungen gehandhabt, was zu einer erhöhten Komplexität führt.
Intensives Lesen/Schreiben
Der MapReduce-Job speichert nur wenige Daten im Speicher, da er kein Konzept einer verteilten Speicherstruktur für Benutzerdaten hat. Daten müssen in HDFS geschrieben und daraus gelesen werden. Bei komplexeren MapReduce-Anwendungen werden kleinere MapReduce-Jobs miteinander verkettet. Da zwischen diesen Jobs keine Daten übertragen werden können, müssen das Data Sharing über HDFS erfolgen. Dies führt zu einem Verarbeitungsengpass.
Java-fokussiert
MapReduce basiert auf Java und daher ist die Verwendung von Java die effizienteste Möglichkeit, Anwendungen dafür zu schreiben. Sein Code muss in einer separaten Entwicklungsumgebung kompiliert und dann in den Hadoop- Cluster angewendet werden. Dieser Entwicklungsstil ist bei Data Analysts und Data Scientists, die an andere Technologien wie SQL oder interpretierte Sprachen wie Python gewöhnt sind, nicht weit verbreitet. MapReduce bietet die Möglichkeit, Map/Reduce-Logik aufzurufen, die in anderen Sprachen wie C, Python oder Shell Scripting geschrieben ist. Dies geschieht jedoch, indem ein Systemprozess gestartet wird, der die Ausführung dieser Programme übernimmt. Diese Vorgehensweise verursacht einen Aufwand, der sich auf die Performance des Jobs auswirkt.
Langsame Ausmusterung bei Big-Data-Angeboten
MapReduce wird langsam aus Big-Data-Angeboten ausgemustert. Während einige Anbieter es immer noch in ihre Hadoop-Distribution aufnehmen, geschieht dies, um ältere Anwendungen zu unterstützen. Kunden haben sich von der Erstellung von MapReduce-Anwendungen entfernt und stattdessen einfachere und schnellere Frameworks wie Apache Spark übernommen.
Wofür wird MapReduce verwendet?
Ältere Anwendungen und native Hadoop-Tools wie Sqoop und Pig nutzen MapReduce weiterhin. Die Entwicklung von MapReduce-Anwendungen ist sehr begrenzt und es werden auch keine nennenswerten Beiträge dazu als Open-Source-Technologie geleistet.
Häufige Missverständnisse über MapReduce und Spark
- Über MapReduce
- Über Spark
Vorteile von MapReduce
- Skalierbarkeit
- Flexibilität
- Sicherheit und Authentifizierung
- Schnellere Datenverarbeitung
- Sehr einfaches Programmiermodell
- Verfügbarkeit und Belastbarkeit
Einfache Tipps zur Verbesserung der MapReduce-Performance
- Aktivieren des Uber-Modus
- Verwenden der nativen Bibliothek
- Erhöhen der Blockgröße
- Überwachen der von den Map-Tasks benötigten Zeit
- Feststellen, ob die Datenkomprimierung aufteilbar ist oder nicht
- Festlegen der Anzahl der Tasks
- Analysieren der Datenpartition
- Mischen von Phasen-Performance-Bewegungen
- Optimieren des MapReduce-Codes
MapReduce vs. Databricks Delta Engine
Die Databricks Delta Engine basiert auf Apache Spark und einer C++-Engine namens Photon. Dies ermöglicht die Flexibilität der DAG-Verarbeitung, die MapReduce fehlt, die Geschwindigkeit der In-Memory-Verarbeitung und eine spezialisierte, nativ kompilierte Engine, die blitzschnelle Abfrage- und auch Antwortzeiten bietet. Benutzer können mit der Databricks Delta Engine über Python, Scala, R oder SQL interagieren. Bestehende Spark-Anwendungen können durch eine einfache Zeilenänderung, z. B. durch Angabe von „Delta“ als Datenformat, so geändert werden, dass sie die Delta Engine verwenden. MapReduce und HDFS unterstützen weder nativ die Transaktionskonsistenz von Daten noch die Möglichkeit, vorhandene Daten innerhalb von Datasets zu aktualisieren/löschen. Die Delta Engine ermöglicht den gleichzeitigen Zugriff auf Daten durch Datenproduzenten und -konsumenten und bietet außerdem vollständige CRUD-Funktionen. Schließlich verfügt MapReduce nicht über integrierte Funktionen zur Bewältigung kleiner Dateien, ein häufiges Problem in jeder Big-Data-Umgebung. Databricks Delta Engine optimiert über eine automatische Komprimierung die Größe der in den Speicher geschriebenen Daten. Außerdem können Dateien über einen OPTIMIZE-Befehl bei Bedarf komprimiert werden. Mit dem Feature von Delta für transaktionale Konsistenz kann dieser Vorgang ausgegeben werden, während Endbenutzer oder Anwendungen auf Daten zugreifen.
Die fünf besten Alternativen zu MapReduce
- Apache Spark
- Apache Storm
- Ceph
- Hydra
- Google BigQuery