Hadoop MapReduce: Können zwei Mapper und Reducer in einer Hadoop-Jobklasse definiert werden?

8

Ich habe zwei getrennte Java-Klassen, um zwei verschiedene mapreduce-Jobs zu erledigen. Ich kann sie unabhängig ausführen. Die Eingabedateien, mit denen sie arbeiten, sind für beide Jobs identisch. Meine Frage ist also, ob es möglich ist, zwei Mapper und zwei Reducer in einer Java-Klasse wie

zu definieren %Vor%

und dann wie

%Vor%

Überschreiben diese Methoden tatsächlich die vorherigen oder fügen Sie neue hinzu? Ich habe den Code ausprobiert, aber er führt nur die letzten gegebenen Klassen aus, die mich denken lassen, dass er überschrieben wird. Aber es muss einen Weg geben, das richtig zu machen?

Der Grund, warum ich das frage, ist, dass ich die Eingabedateien nur einmal (ein I / O) lesen und dann zwei Map Reduce-Jobs verarbeiten kann. Ich würde auch gerne wissen, wie ich die Ausgabedateien in zwei verschiedene Ordner schreiben kann. Im Moment sind beide Jobs getrennt und benötigen ein Eingabe- und ein Ausgabeverzeichnis.

    
Bob 20.06.2012, 15:23
quelle

4 Antworten

11

Sie können mehrere Mapper haben, aber in einem Job können Sie nur einen Reducer haben. Und die benötigten Features sind MultipleInput , MultipleOutput und GenericWritable .

Mit MultipleInput können Sie den Mapper und das entsprechende inputFormat setzen. Hier ist mein Beitrag zur Verwendung.

Mit GenericWritable können Sie verschiedene Eingabeklassen im Reducer trennen. Hier ist mein Beitrag zur Verwendung.

Mit MultipleOutput können Sie verschiedene Klassen in demselben Reduzierer ausgeben.

    
Chun 20.06.2012 22:23
quelle
1

Sie können dafür die Klassen MultipleInputs und MultipleOutputs verwenden, aber die Ausgabe beider Mapper wird an beide Reduzierungen gehen. Wenn die Datenflüsse für die zwei Mapper / Reducer-Paare wirklich voneinander unabhängig sind, dann behalten Sie sie als zwei separate Jobs bei. Übrigens, MultipleInputs wird Ihre Mapper ohne Änderung ausführen, aber die Reduzierungen müssten geändert werden, um MultipleOutputs zu verwenden

    
Chris Gerken 20.06.2012 15:54
quelle
0

Nach meinem Verständnis, das sich aus der Verwendung von Map-Reduced mit Hadoop-Streaming ergibt, können Sie mehrere Mapper und Reducer verketten, wobei die Ausgabe eines anderen

verbraucht wird

Sie sollten jedoch nicht in der Lage sein, verschiedene Mapper und Reducer gleichzeitig auszuführen. Mapper selbst sind auf keine der zu verarbeitenden Blöcke angewiesen. Mapper sollte basierend auf dieser Entscheidung instanziiert werden und nicht die Vielfalt der für den Job verfügbaren Mapper.

[Bearbeiten: Basierend auf Ihrem Kommentar]

Ich glaube nicht, dass das möglich ist. Sie können verketten (wo Reducer alle Eingaben von Mappern erhalten. Sie können sie sequenzieren, aber Sie können nicht ausschließlich unabhängige Sets von Mapper und Reducern ausführen.

Ich denke, was Sie tun können, ist, obwohl Sie beide Eingänge von den Mappern in beide Reduzierungen erhalten, können Sie Mapper ausgeben (K, V) ist so, dass Sie in Ihren Reduzierungen als unterscheiden könnten Welcher Mapper war der Ursprung von (K, V). Auf diese Weise können beide Reduzierer auf selektiven (K, V) Paaren arbeiten.

    
pyfunc 20.06.2012 15:54
quelle
0

Die Klasse ChainMapper ermöglicht dies Verwenden Sie mehrere Mapper-Klassen innerhalb einer einzelnen Map-Aufgabe. Schauen Sie sich zum Beispiel hier an.

    
jeton 17.04.2016 22:44
quelle

Tags und Links