2016-04-16 15 views
0

Ich habe mehrere Eingaben, also habe ich zwei Mapper. Außerdem habe ich einen Combiner:Warum Combiner-Ausgangsdatensätze = 0?

Wenn ich diese Klasse als Reducer benutze - alle Wörter gut. aber wenn ich es als Kombinierer verwenden - ich habe diese Informationen in Log:

Combine input records=6 
Combine output records=0 
Reduce input groups=0 
Reduce shuffle bytes=30 
Reduce input records=0 
Reduce output records=0 

also keine Ausgabe vom Kombinierer -> keine Eingabe zu reduzieren. Ich verstehe nicht warum. Bitte machen Sie eine Erklärung, wenn Sie Ideen haben)) Danke

Antwort

0

Ein Combiner wird nur ausgeführt, wenn Sie einen Reducer haben. Versuchen Sie, sowohl den Combiner als auch den Reducer auf die gleiche Klasse zu setzen (falls möglich) und erwägen Sie auch, die Anzahl der reduzierenden Aufgaben festzulegen.

UPDATE: Sie versuchen, den Schlüssel in Combiner zu ändern. Der Zweck des Kombinierers besteht darin, die Werte des gleichen Schlüssels lokal zu gruppieren, um den Verkehr zu reduzieren.

Aus den Hadoop Tutorial on YDN

Instanzen der Combiner Klasse werden an jedem Knoten ausgeführt, die Karte Aufgaben ausgeführt wurde. Der Combiner empfängt alle von den Mapper-Instanzen auf einem bestimmten Knoten ausgegebenen Daten als Eingabe. Die Ausgabe vom Combiner wird dann an die Reduzierer gesendet, anstatt an die Ausgabe der Mapper.

Basierend auf meiner Erfahrung ist das nicht völlig richtig. Hadoop sendet nur die Schlüssel, die vom Mapper an den Reducer gesendet werden. Wenn Sie also einen Combiner haben, sollte derselbe Schlüssel wie der des Mappers ausgegeben werden, um die Anzahl der mit dem Schlüssel verknüpften Werte zu reduzieren. IMO, das Ändern der Schlüssel in dem Kombinierer führt zu unerwartetem Verhalten. Um einen einfachen Anwendungsfall von Kombinatoren zu verstehen, betrachten Sie einen Wortzähler.

Mapper1 aussendet:

hi 1 
hello 1 
hi 1 
hi 1 
hello 1 

Mapper2 aussendet:

hello 1 
hi 1 

Sie haben sieben Ausgabesätze. Nun, wenn Sie die Anzahl der Schlüssel lokal reduzieren wollen (dh auf der gleichen Maschine, auf der Mapper ist runnning), dann einen Kombinierer mit geben Ihnen etwas wie folgt aus:

Combiner1 aussendet:

hi 3 
hello 2 

Combiner2 aussendet:

hello 1 
hi 1 

Beachten Sie, dass Kombinierer nicht den Schlüssel ändern. Jetzt, am Minderer, sehen Sie die Werte wie diese:

Reducer1: key: hi, values: <3, 1> und Sie emittieren hi 4

Weil du nur ein Minderer haben, wird das gleiche Minderer erneut aufgerufen werden, indem er einen anderen Schlüssel geben diesmal.

Reducer1: key: hello, values: <2, 1> und Sie emittieren hello 3

Die Endausgabe sein würde, wie

hello 3 
hi 4 

folgt der Ausgang auf der Basis der Tasten durch den Mapper emittiert sortiert wird. Sie können den vom Reduzierer ausgegebenen Schlüssel ändern, aber Ihre Ausgabe wird nicht nach dem vom Reduzierer ausgegebenen Schlüssel sortiert (standardmäßig). Ich hoffe, das hilft.

+0

werfen Sie bitte einen Blick, was ich habe. Dies ist meine Konfiguration für den Job: \t \t conf.setCombinerClass (JoinCombiner.class); \t \t conf.setReducerClass (JoinCombiner.class); \t \t \t \t conf.setNumReduceTasks (1); \t \t Und was ich in anmelden: \t \t \t Map Eingabesätze = 6 \t \t Map Ausgabesätze = 6 \t \t Karte Ausgangs-Bytes = 58 \t \t Map Ausgang materialisiert Bytes = 30 \t \t Eingang Split Bytes = 1070 \t \t Eingabesätze Kombinieren = 6 \t \t Kombinieren Ausgabesätze = 0 \t \t reduzieren Eingangsgruppen = 0 \t \t reduzieren Shuffle Bytes = 30 \t \t reduzieren Eingabesätze = 0 \t \t Ausgabesätze reduzieren = 0 – user3650408

+0

Sieht aus wie Sie den Schlüssel in den Kombinierer sind zu ändern. Siehe meine aktualisierte Antwort. –

+0

Sie können in diesem stackoverflow Post nach interessanteren Informationen über den Combiner suchen: http://stackoverflow.com/questions/20212884/mapreduce-combiner –