© DrHitch/Shutterstock.com
Big Data

2 Hadoop MapReduce in Kombination mit Cassandra


Parallelisierte Datenanalyse im Computercluster

Mit dem Framework und Programmiermodell MapReduce können riesige Datenmengen robust und schnell in einem Computercluster verarbeitet werden. In diesem Text wird MapReduce anhand eines Beispiels vorgestellt. Hadoop MapReduce arbeitet standardmäßig auf dem verteilten Dateisystem HDFS. Alternativ wird die NoSQL-Datenbank Cassandra verwendet, um von den Stärken beider Technologien zu profitieren.

MapReduce [1] ist ein von Google entwickeltes Framework und Programmiermodell zur Verarbeitung großer Datenmengen in Computerclustern. Mit ihm können petabytegroße Datenmengen zuverlässig mit Commodity-Hardware verarbeitet werden. Eine Arbeitseinheit wird als „MapReduce Job“ bezeichnet. Ein solcher Job könnte beispielsweise Texte für Suchanfragen indizieren oder Statistiken auf Basis von Server-Log-Dateien erstellen. Dazu werden die riesigen Datenmengen in kleinere Einheiten aufgeteilt und von unterschiedlichen Servern verarbeitet. So besteht ein einzelner Job aus vielen kleinen Tasks, die benutzerdefinierte Funktionen ausführen, um die gewünschte Analyse Stück für Stück durchzuführen.

Apache Hadoop [2] bietet eine Java-basierte Implementierung von MapReduce, dessen Funktionsweise im Mittelpunkt dieses Abschnitts steht. Doch Apache Hadoop ist mehr als nur MapReduce. Zu den Subprojekten gehören zum Beispiel das verteilte Dateisystem HDFS (Hadoop Distributed File System), die NoSQL-Datenbank HBase, die Datawarehouse-Infrastruktur Hive und die Datenverarbeitungsplattform Pig. Beim Entwurf von Hadoop wurden folgende Ideen, Anforderungen und Probleme berücksichtigt:

  • Die Datenmenge wächst unaufhörlich: Lineare Skalierbarkeit ist eine der wichtigsten Eigenschaften von MapReduce. Verdoppelt sich die Menge der zu verarbeitenden Daten, kann die Verarbeitungszeit prinzipiell konstant gehalten werden, indem die Anzahl der Knoten im Computercluster verdoppelt wird.
  • Verteilung von Daten: Die Kapazitäten, Transferraten und Zugriffszeiten von Festplatten wuchsen in den vergangen Jahrzehnten in ungleichen Verhältnissen. Deswegen benötigt man heute mehr Zeit zum Lesen des gesamten Festplatteninhalts als vor 20 Jahren [3]. Die Lesezeit kann durch Parallelisierung verringert werden. Das heißt, verteilt man beispielsweise die Daten einer Festplatte auf 100 Festplatten, dann müssen diese nur jeweils einen Prozent der Daten lesen.
  • Kolokation von Daten und Berechnung: Damit die Netzwerkbandbreite nicht zum Flaschenhals wird, versucht MapReduce die Netzwerklast zu minimieren, indem es die Berechnung auf dem Knoten ausführt, auf dem auch die Daten gespeichert sind.
  • Fehler können immer auftreten: Um Hochverfügbarkeit trotz Einsatz von kostengünstiger Commodity-Hardware garantieren zu können, muss die Fehlererkennung und -behandlung in die Anwendungsschicht gehoben werden. HDFS und Cassandra können den Ausfall einiger Knoten durch den Einsatz von Replikaten kompensieren. Auch das MapReduce-Framework kann mit Fehlern umgehen. Falls während eines MapReduce-Jobs ein Fehler auf einem Knoten auftritt, werden die Teilergebnisse dieses Knotens verworfen und die Aufgabe des Knotens wird von einem anderen wiederholt.

Wenn man für einen Moment von einigen technischen Details abstrahiert, dann ist die Grundidee hinter Hadoop MapReduce recht einfach: Sowohl die Speicherung der Daten als auch deren Verarbeitung wird auf ausreichend viele Knoten in einem Computercluster verteilt. Dauert die Verarbeitung zu lang oder wächst die Datenmenge, dann können weitere Knoten hinzugefügt und die Daten neu verteilt werden. Durch Parallelisierung wird die Zeit für das Lesen und die Verarbeitung verkürzt. Um die Netzwerklast zu minimieren und die Performance zu verbessern, werden die Daten von den Knoten verarbeitet, auf denen sie auch gespeichert werden. Die Koordination der beteiligten Prozesse sowie die Fehlerbehandlung übernimmt das MapReduce-Framework. Benutzerdefinierte Funktionen werden eingesetzt, um große Datenmengen in kleinen Teilen zu verarbeiten. Wie im folgenden Abschnitt erläutert wird, sind diese benutzerdefinierten Funktionen nicht beliebig. Sie müssen zustandslos sein und bestimmte Interfaces implementieren. Auch der gesamte Datenfluss und die Phasen eines MapReduce-Jobs sind genau definiert. Die Daten werden in Form von Schlüssel-Wert-Paaren verarbeitet. Die Aufteilung der Daten in kleinere Einheiten, genannt Input Splits, muss zur beabsichtigten Verarbeitung passen. Eine Einheit muss unabhängig von den anderen Einheiten verarbeitet werden können. Soll beispielsweise das Vorkommen eines Wortes in einem ein Gigabyte großen Dokument gezählt werden, so könnte dieses Dokument in 16 Einheiten a 64 Megabyte gespeichert und verarbeitet werden. Die Speicherung und Verarbeitung dieser Einheiten kann auf verschiedenen Knoten erfolgen.

Phasen und Funktionen eines MapReduce-Jobs

Ein MapReduce-Job durchläuft drei Phasen. In der ersten Phase, der Map-Phase, verarbeitet eine Map-Funktion einzelne Schlüssel-Wert-Paare und erzeugt dabei eine Menge weiterer Schlüssel-Wert-Paare. Die so gebildeten Paare werden in der anschließenden Combine-Phase anhand ihrer Schlüssel gruppiert und zusammengefasst. In der optionalen Reduce-Phase berechnet die Reduce-Funktion das Endergebnis. Sowohl die Map- als auch die Reduce-Funktion sind zustandslos und können parallelisiert we...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang