In einem datengetriebenen Markt sammeln Algorithmen und Anwendungen rund um die Uhr Informationen zu Personen, Prozessen, Systemen und Organisationen. Das Ergebnis ist eine gigantische Datenflut, die täglich zunimmt. Die Herausforderung besteht nun darin, diese massiven Datenmengen schnell und effizient zu verarbeiten, ohne dass wertvolle Erkenntnisse verlorengehen.

Hierbei kommt das MapReduce-Programmiermodell zum Einsatz. Ursprünglich wurde es von Google zum Analysieren seiner Suchergebnisse verwendet. Aufgrund seiner Fähigkeit, Terabytes an Daten aufzuteilen und parallel zu verarbeiten, ist MapReduce überaus populär geworden.

Was ist MapReduce?

MapReduce ist ein Programmiermodell bzw. Muster im Hadoop-Framework, das für den Zugriff auf Big Data im Hadoop File System (HDFS) verwendet wird. Es ist eine Kernkomponente, die für das Funktionieren des Hadoop-Frameworks unabdingbar ist.

MapReduce teilt Petabytes an Daten in kleinere Einheiten auf, die auf Hadoop-Commodity-Servern parallel verarbeitet werden, und erleichtert so die gleichzeitige Verarbeitung. Am Ende werden alle Daten von mehreren Servern aggregiert und eine konsolidierte Version an die Anwendung zurückgespielt.

Weitere Informationen erhalten Sie unter „Was ist Hadoop?“ →

Ein Beispiel: Ein Hadoop-Cluster aus 20.000 preiswerten Commodity-Servern mit jeweils 256 MB großen Datenblöcken kann rund 5 TB an Daten gleichzeitig verarbeiten. Dies reduziert die Verarbeitungszeit im Vergleich zur sequenziellen Verarbeitung solch großer Datensätze.

Mit MapReduce werden die Daten nicht dorthin übertragen, wo sich die Anwendung oder die Logik befindet. Stattdessen wird die Logik zur schnelleren Verarbeitung auf dem Server ausgeführt, auf dem die Daten bereits liegen. Datenzugriff und Speicherung erfolgen Festplatten-basiert – die Eingabedaten werden normalerweise in Dateien mit strukturieren, semistrukturierten oder unstrukturierten Informationen gespeichert und auch die Ausgabedaten werden in Dateien gespeichert.

MapReduce war früher die einzige Methode, um die im HDFS gespeicherten Daten abzurufen, aber das ist inzwischen nicht mehr der Fall. Heute gibt es noch andere abfragebasierte Systeme wie Hive und Pig, die zum Abrufen von Daten im HDFS mit SQL-ähnlichen Anweisungen verwendet werden. Diese laufen jedoch meist mit Jobs, die mithilfe des MapReduce-Modells geschrieben wurden. Der Grund dafür sind die einzigartigen Vorteile, die MapReduce bietet.

So funktioniert MapReduce

MapReduce basiert auf den zwei Funktionen Map und Reduce, die nacheinander ausgeführt werden.

  • Die Map-Funktion nimmt die Eingabedaten von der Festplatte als <Schlüssel,Wert>-Paare, verarbeitet sie und generiert einen weiteren Satz an <Schlüssel,Wert>-Zwischenpaaren als Ausgabe.
  • Die Reduce-Funktion nimmt ebenfalls Eingabedaten als <Schlüssel,Wert>-Paare und generiert <Schlüssel,Wert>-Paare als Ausgabe.

Die Arten der Schlüssel und Werte unterscheiden sich je nach Einsatzszenario. Alle Eingabe- und Ausgabedaten sind im HDFS gespeichert. Während die Map-Funktion zwingend zum Filtern und Sortieren der ursprünglichen Daten erforderlich ist, kann Reduce optional eingesetzt werden.

<k1, v1> -> Map() -> list(<k2, v2>)
<k2, list(v2)> -> Reduce() -> list(<k3, v3>)

Die Mapper und Reducer sind die Hadoop-Server, auf denen die Map- bzw. Reduce Funktionen ausgeführt werden. Dabei ist es egal, ob es sich um die gleichen oder unterschiedliche Server handelt.

Map

Zuerst werden die Eingabedaten in kleinere Blöcke aufgeteilt, die dann jeweils einem Mapper zur Verarbeitung zugewiesen werden.

Wenn in einer Datei beispielsweise 100-Datensätze zu verarbeiten sind, können 100 Mapper gleichzeitig laufen, um jeweils einen Datensatz zu verarbeiten. Genauso gut können aber auch 50 Mapper jeweils zwei Datensätze verarbeiten. Das Hadoop-Framework entscheidet je nach Umfang der zu verarbeitenden Daten und Verfügbarkeit der Speicherblöcke auf den einzelnen Mapper-Servern, wie viele Mapper eingesetzt werden.

Reduce

Wenn alle Mapper die Verarbeitung abgeschlossen haben, reorganisiert und sortiert das Framework die Ergebnisse und leitet sie an die Reducer weiter. Ein Reducer kann nicht anfangen, solange ein Mapper noch arbeitet. Alle Map-Ausgabewerte mit dem gleichen Schlüssel werden einem einzigen Reducer zugewiesen, der dann die Werte für diesen Schlüssel aggregiert.

Combine und Partition

Es gibt noch zwei Schritte, die zwischen Map und Reduce liegen.

Combine ist ein optionaler Prozess. Beim Combiner handelt es sich um einen Reducer, der einzeln auf den jeweiligen Mapper-Servern läuft. Er reduziert die Daten auf den einzelnen Mappern zu einer noch vereinfachteren Form, bevor er sie weitergibt.

Dies erleichtert die Reorganisation und Sortierung, da weniger Daten zu verarbeiten sind. Häufig ist die Combiner-Klasse aufgrund der kumulativen und assoziativen Funktionen in der Reduce-Funktion auf die Reducer-Klasse selbst eingestellt. Bei Bedarf kann der Combiner aber auch eine separate Klasse sein.

Der Partition-Prozess übersetzt die <Schlüssel,Wert>-Paare aus den Mappern in einen anderen Satz an <Schlüssel, Wert>-Paaren, um sie an den Reducer weiterzugeben. Dieser Prozess entscheidet, wie die Daten dem Reducer präsentiert werden sollen, und weist sie einem bestimmten Reducer zu.

Der Standard-Partitioner bestimmt den Hash-Wert für den Schlüssel vom Mapper und weist entsprechend diesem Hash-Wert eine Partition zu. Dabei gibt es so viele Partitionen wie Reducer. Sobald die Partitionierung abgeschlossen ist, werden die Daten von den einzelnen Partitionen an einen bestimmten Reducer gesendet.

Ein MapReduce-Beispiel

Nehmen wir an, ein E-Commerce-System erhält täglich eine Million Anfragen zur Zahlungsabwicklung. Dabei können Exeptions ausgelöst werden wie „Zahlung von einem Zahlungsgateway abgelehnt“, „Nicht auf Lager“ oder „Ungültige Adresse“. Ein Entwickler möchte die Protokolle der letzten vier Tage analysieren, um zu sehen, welche Ausnahme wie oft ausgegeben wurde.

Beispielszenario

Das Ziel ist, die fehleranfälligsten Anwendungsfälle zu isolieren und entsprechende Maßnahmen zu veranlassen. Wenn beispielsweise das gleiche Zahlungsgateway häufig eine Ausnahme ausgibt, stellt sich die Frage, ob dies auf einen unzuverlässigen Service oder eine schlecht programmierte Schnittstelle zurückzuführen ist. Erscheint häufig die Ausnahme „Nicht auf Lager“ ist es wichtig zu wissen, ob die Bestandskalkulierung verbessert oder der Bestand für bestimmte Produkte erhöht werden muss.

Jetzt liegt es am Entwickler, die relevanten Fragen zu stellen und die richtigen Schritte einzuleiten. Das Programmiermodell MapReduce eignet sich perfekt, um umfangreiche Protokolle mit Millionen von Datensätzen zu analysieren. Mehrere Mapper können diese Protokolle gleichzeitig verarbeiten: So könnte beispielsweise jeweils ein Mapper ein Tagesprotokoll oder einen Teil davon basierend auf der Protokollgröße und dem zur Verarbeitung im Mapper-Server verfügbaren Speicherblock verarbeiten.

Map

Nehmen wir zur Vereinfachung an, dass im Hadoop-Framework nur vier Mapper laufen: Mapper 1, Mapper 2, Mapper 3, and Mapper 4.

Die Werteingabe in den Mapper ist ein Datensatz der Protokolldatei. Der Schlüssel könnte ein Textstring sein wie z. B. „Dateiname + Zeilennummer“. Der Mapper verarbeitet anschließend die einzelnen Datensätze der Protokolldatei, um Schlüssel-Wert-Paare zu generieren. In diesem Beispiel verwenden wir nur den Füllzähler „1“ für den Wert. Die Ausgabe von den Mappern sieht so aus:

Mapper 1 -> , , , ,
Mapper 2 -> , , ,
Mapper 3 -> , , , ,
Mapper 4 -> , , ,

Angenommen es gibt einen Combiner auf jedem Mapper – Combiner 1 … Combiner 4 – der die Anzahl der einzelnen Ausnahmen berechnet (das ist die gleiche Funktion wie der Reducer), dann ist die Eingabe in Combiner 1:

, , , ,

Combine

Die Ausgabe von Combiner 1 ist:

, ,

Die Ausgabe aus den anderen Combinern ist:

Combiner 2:
Combiner 3:
Combiner 4:

Partition

Anschließend weist der Partitioner die Daten aus den Combinern den Reducern zu. Die Daten sind auch für den Reducer sortiert.

Die Reducer erhalten dann folgenden Input:

Reducer 1: {3,2,3,1}
Reducer 2: {1,2,1,1}
Reducer 3: {1,1,2}

Wären keine Combiner beteiligt, wäre der Input für die Reducer:

Reducer 1: {1,1,1,1,1,1,1,1,1}
Reducer 2: {1,1,1,1,1}
Reducer 3: {1,1,1,1}

Dies ist ein einfaches Beispiel, doch bei Anwendungsfällen mit Terabytes an Daten optimiert der Combiner-Prozess die Bandbreite erheblich.

Reduce

Jetzt berechnet jeder Reducer die Gesamtanzahl der Ausnahmen nur als:

Reducer 1:
Reducer 2:
Reducer 3:

Die Daten zeigen, dass Exception A besonders häufig ausgegeben wird und daher mehr Aufmerksamkeit benötigt. Wenn Daten aus mehr als nur einigen Wochen oder Monaten gemeinsam verarbeitet werden müssen, kann das Potential des MapReduce-Programms voll ausgeschöpft werden.

Implementierung von MapReduce

MapReduce-Programme sind nicht auf Java beschränkt. Sie können auch in C, C++, Python, Ruby, Perl, etc. geschrieben werden. So sieht die Hauptfunktion eines typischen MapReduce-Jobs aus:

public static void main(String[] args) throws Exception {

JobConf conf = new JobConf(ExceptionCount.class);
conf.setJobName("exceptioncount");

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
conf.setCombinerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));

JobClient.runJob(conf);

}

Die Parameter – MapReduce-Klassennamen, Map-, Reduce- und Combiner-Klassen, Eingabe- und Ausgabearten, Eingabe- und Ausgabe-Dateipfade – sind alle in der Hauptfunktion definiert. Die Mapper-Klasse erweitert MapReduceBase und implementiert die Mapper-Schnittstelle. Die Reducer-Klasse erweitert MapReduceBase und implementiert die Reducer-Schnittstelle.

Detaillierte Codebeispiele erhalten Sie in den Hadoop-Tutorials.

MapReduce-Tutorials in Talend

MapReduce ist zwar ein flexibler und ausfallsicherer Ansatz, um Big Data-Probleme zu lösen, doch aufgrund seiner Komplexität dauert es einige Zeit, bis Entwickler sich die erforderliche Expertise angeeignet haben. Unternehmen brauchen qualifizierte Fachkräfte und eine robuste Infrastruktur, um mit MapReduce massive Datenmengen zu bewältigen.

Hier kommt die Datenintegrationslösung von Talend ins Spiel. Sie bietet ein fertiges Framework, um die unterschiedlichen Tools aus dem Hadoop-Ökosystem wie Hive, Pig, Flume, Kafka und HBase zusammenzubringen. Talend Studio mit seiner oberflächenbasierten Umgebung erlaubt Benutzern, Daten aus dem HDFS zu laden und zu extrahieren.

Sehen Sie sich ein Einführungsvideo zu Talend Studio an. →

Insbesondere für MapReduce ist es mit Talend Studio einfacher, Jobs zu erstellen, die im Hadoop-Cluster laufen können, Parameter wie Mapper- und Reducer-Klasse zuzuweisen und Eingabe- sowie Ausgabeformate etc. festzulegen.

Sobald Sie einen Talend MapReduce-Job erstellen (dieser unterscheidet sich von der Definition eines Apache Hadoop-Jobs), können Sie ihn als Service, als ausführbare Datei oder als eigenständigen Job implementieren, der nativ im Big Data-Cluster läuft. Er bring einen oder mehrere Hadoop MapReduce-Jobs hervor, die wiederum den MapReduce -Algorithmus ausführen.

Bevor ein MapReduce-Job ausgeführt wird, muss die Hadoop-Verbindung konfiguriert werden. Weitere Informationen darüber, wie Sie Talend zum Einrichten von MapReduce-Jobs verwenden, erhalten Sie in diesen Tutorials.

Big Data-Probleme mit MapReduce lösen

Das MapReduce-Programmierparadigma eignet sich für alle komplexen Aufgabestellungen, die sich durch Parallelisierung lösen lassen.

Eine Social Media-Plattform könnte damit die Anzahl der Neuanmeldungen in verschiedenen Ländern im letzten Monat ermitteln, um sich ein Bild über ihre wachsende Beliebtheit in unterschiedlichen Regionen zu machen. Ein Tradingunternehmen könnte einen schnelleren Batch-Datenabgleich durchführen und herausfinden, welche Szenarien häufig dazu führen, dass Trades platzen. Suchengines könnten Seitenaufrufe bestimmen und Marketing-Unternehmen Sentimentanalysen mit MapReducze durchführen.

Sie möchten mehr über MapReduce erfahren und mit Anwendungsfällen wie den oben beschriebenen experimentieren? Dann laden Sie noch heute eine Testversion von Talend Studio herunter.

Sind Sie bereit, mit Talend durchzustarten?