Hadoop

Hadoop ist ein freies, auf Java basierendes, quelloffenes Framework, das unter der Apache Software Lizenz entwickelt wird.

Entwickelt hat es Doug Cutting, als er im Jahre 2002 sein Open-Source Projekt „Apache Nutch“ startete. Ziel war damals eine leistungsfähige Softwarearchitektur zu entwickeln, die genauso leistungsfähig wie kommerzielle Systeme sein sollte und in der Lage war, das gesamte Internet zu Indexieren. Den Durchbruch hierzu lieferte ein Vortrag von Jeffrey Dean und Sanjay Ghemawat (ihres Zeichens Mitarbeiter bei Google), gehalten im Rahmen des 6. Symposiums Operating Systems Design and Implementations (OSDI) in San Francisco. Der Titel dieses Vortrags lautete: „MapReduce – Simplified Data Processing on Large Clusters“. Inspiriert durch den Vortrag Implementierte Cutting ein Filesystem auf der Basis von Googles File System (GFS) und realisierte drauf aufbauend den MapReduce Ansatz. Im Jahr 2006, Cutting fängt bei Yahoo an zu arbeiten, werden aus Apache Nutch das verteilte Dateisystem und das MapReduce Framework extrahiert und in ein eigenes Framework überführt. Cutting benennt es nach dem gelben Stoffelefant seines Sohnes „Hadoop“. Im gleichen Jahr wird Hadoop offizielles Apache-Projekt. In 2008 gewinnt eine Hadoop Installation von Yahoo als erstes Java basiertes Open-Source Projekt den Terabyte-Sort-Benchmark.

Hadoop wird dazu genutzt, große Datenmengen zu verarbeiten. Der Vorteil gegenüber etablierten Datenbanken und Business Intelligence Anwendungen liegt an den zwei Punkten der geringen Hardwareansprüche (spart Geld) und der verteilten Verarbeitung großer Datenmengen in Clustern (spart Zeit). Wobei anzumerken ist, dass von Hadoop gelieferte Daten auch in anderen Anwendungen genutzt werden können.

Im Kern besteht Hadoop aus den folgenden zwei Komponenten:

Hadoop Distributed File System (HDFS)

HDFS ist das verteilte Dateisystem von Hadoop. Es zeichnet sich durch eine hohe Ausfallsicherheit aus sowie der Möglichkeit des Einsatzes auf kostengünstiger Hardware. HDFS verteilt die gegebenen Daten auf die unterschiedlichen Rechner des Clusters.

MapReduce

Das MapReduce-Framework übernimmt die Datenverarbeitung der von HDFS verteilten Daten. (siehe: MapReduce in Hadoop)

Zusätzliche auf Hadoop aufbauende Erweiterungen sind unter anderem:

Hive

Programmiert in Java, ist Hive? ein Data-Warehouse-System für Hadoop. Es implementiert eine eigene, SQL-Ähnliche Abfragesprache namens HiveQL?.

Pig

Pig ist eine Plattform für die Analyse großer Datenmengen. Im Vergleich zu SQL mutet sie eher wie eine Skriptsprache an. Durch Parallelisierungsmöglichkeiten ist sie für große Datenmengen besonders geeignet.

HBase

HBase ist eine spaltenorientierte Datenbank. Sie wurde, inspiriert durch den BigTable -Ansatz von Google, als Erweiterung für Hadoop entwickelt. Sie eignet sich besonders, wenn real-time read/write-Zugriffe auf große Datenbestände benötigt werden.

Avro

Avro ist ein Daten-Serialisierungs-Framework. Es dient dem Datenaustusch anderer Anwendungen mit Hadoop.

Azkaban

Azkaban ist ein Workflow Management System für Hadoop Prozesse. Es Erlaubt in Hadoop, ähnlich wie der cron-Deamon in Unix, die zeitgesteuerte und automatisierte Ausführung von Prozessen. Azkaban ist im Gegensatz zu den vorgenannten Produkten (noch) kein Apache Projekt.

MapReduce in Hadoop

Für eine allgemeingültige Definition siehe MapReduce.

MapReduce Grafik
MapReduce in Hadoop
Erstellt von gmuenster.

Input Files (0):
Nachdem die Daten (typischerweise) durch HDFS auf die einzelnen Rechner im Cluster verteilt wurden übernimmt das MapReduce-Framework die Weiterverarbeitung. Hierzu werden im ersten Schritt die Daten aus dem lokalen HDFS -Speicher gelesen. Diese Daten können in unterschiedlichen Formaten (beispielsweise zeilenbasiert oder binär) vorliegen.

InputFormat (1):
Der Schritt InputFormat bestimmt, wie diese Daten gelesen, bzw. aufgespaltet werden sollen. Er ist eine Klasse mit drei Funktionalitäten. Die erste Funktionalität ist die Auswahl von Daten, die als Input genutzt werden sollen. Die zweite Funktionalität ist die Definition der InputSplits um die Daten aufzusplitten. Die dritte Funktionalität bedient das Objekt RecordReader um die Daten zu lesen. Hadoop bietet verschiedene Arten an Einleseformaten, unter anderem TextInputFormat um zeilenbasierte Text-Dateien zu verarbeiten oder KeyValueInputFormat um Daten in Schlüssel und Wertepaare aufzuteilen. Ein Hadoop-spezifisches Format ist das SequenceFileInputFormat . Es dient beispielsweise als Ausgabeformat eines MapReduce-Schrittes. Daten, die in diesem Format vorliegen, können besonders schnell in Hadoop mapper eingelesen werden.

InputSplit (2):
Die Ausgangsdaten, normalerweise von mehreren Gigabyte Größe, werden hier aufgeteilt, um sie parallel abarbeiten zu können. Der Zeitgewinn dieser Vorgehensweise ist enorm. In der Standardeinstellung werden die Daten in 64 MB „Häppchen“ aufgeteilt, was der Blockgröße im HDFS entspricht. Selbstverständlich kann dieser Wert den eigenen Belangen angepasst werden.

RecordReader: (3)
Nachdem der InputSplit die Aufgabe in verschiedene Teile aufgespalten hat, muss im Anschluss angegeben werden, wie diese Datenblöcke bearbeitet bzw. gelesen werden können. Hierzu dient der RecordReader . Er lädt die ihm zugewiesenen Daten und teilt sie in Schlüssel-Wertepaare (key (k), value (v)) auf, die dann vom Mapper weiterverarbeitet werden können. Der RecordReader definiert sich durch das InputFormat . Die Funktion wird so lange aufgerufen, bis der InputSplit keine Daten mehr liefert. Jeder Aufruf des RecordReaders ruft die Methode map() auf.

Mapper (4):
Im Mapper läuft der erste benutzerdefinierte Schritt des MapReduce Programms ab. Es werden Schlüssel-Wertepaare aus den Daten gebildet, die der RecordReader liefert. Jeder einzelne map()-Methode läuft autark ohne Kommunikation mit den Nachbarprozessen.

Combiner (5):
Der Schritt des Combiners ist optional. Er kann als Mini-Reducer angesehen werden. Er läuft jeweils auf einer Maschine und bearbeitet nur die auf dieser Maschine erzeugten Daten des Mappers . Hier werden die vom Mapper gelieferten Schlüssel-Wertepaare gesichtet und identische zusammengefasst und der Wert aufsummiert. So ist es möglich, bereits an dieser frühen Stelle die Datenmenge zu reduzieren.

Partitioner & Shuffle (6):
Nachdem die ersten Prozesse des Mappers abgeschlossen wurden, wird damit begonnen, die erzeugten Werte an die jeweiligen Reducer zu liefern. Hierzu wird vom Partitioner festgelegt, wo ein Schlüssel-Wertepaar bearbeitet werden soll und ein Hashwert erzeugt. Dieser Vorgang erfolgt im gesamten Cluster. Der Shuffle -Prozess verteilt die Werte auf die entsprechenden Knoten des Clusters.

Sort (7):
In diesem Schritt werden, durch Hadoop automatisiert, die mit dem nachfolgenden Reduce -Prozess assoziierten Werte sortiert.

Reduce (8):
Dieser Schritt ist der zweite Benutzerdefinierte Bereich im MapReduce . Im Reduce -Schritt werden durch sort gelieferte, identischen Schlüssel-Wertepaare aufsummiert. Dabei wird für jede einzelne Reduce-Aufgabe ein eigener Vorgang gestartet.

OutputFormat (9):
Die gelieferten Schlüssel-Wertepaare werden durch den RecordWriter in den Speicher (HDFS) geschrieben. Das Format, in dem dies geschieht gibt OutputFormat vor. Zu nennen sind hier zum Ersten TextOutputFormat um einen .txt-file zu generieren in dem die Werte zeilenbasiert in der Form Schlüssel \t Wert ausgegeben werden. Das Zweite Format ist das MapReduce -eigene SequenceFileOutputFormat , welches Binärdateien speichert, die sich im Besonderen dazu eignen als neue Ausgangsdaten für weitere MapReduce Durchläufe zu dienen, da sie besonders schnell eingelesen werden können.


Quellen


Kategorie: Datenbanken, NoSQL, Grundlagen, Hadoop, Spaltenorientierte-DB, H