2017-02-20 1 views
0

Ich bin neuer zu Hadoop. Ich habe Probleme mit MapReduce, wenn es sich in einer Cluster-Umgebung befindet.Wie Daten in Cluster-Karte zusammengeführt werden Umgebung reduzieren

Nehmen Sie die Wortanzahl Beispielcode Angenommen, ich habe drei Knoten, und jeder hat eine Karte Aufgaben. Nach Karte: Maschine A:

hello 1 
word 1 
data 1 
... 

Maschine B:

hello 1 
xu 2 
... 

Die Ausgabe des Map werden in lokalen Dateien in und Maschinen gespeichert. Meine Frage ist, wie diese Daten über mehrere Maschinen zusammengeführt werden, bevor sie in die Reduzierungsstufe übergehen. Zum Beispiel empfängt die Verringerung statge

hello <1, 1> 
xu 1 

Antwort

1
  1. In diesem Beispiel Mapper den Mittelwert aus der letzten Zelle jeder Zeile der Eingangsdaten erhalten. Es zählt keine Wörter. Bedenken Sie also, dass Sie mit diesem Mapper keine solchen Wortzählungsausgabedaten aus Ihrem lokalen Dataset erhalten.
  2. Vor dem Start der Reduzierungsstufe gruppiert das MR-Framework die Ausgabe jedes Mappers jedes Knotens in eine einzige, sortiert nach dem Schlüsseldatensatz. Schließlich wird es in eine Reihe von reduzierenden Jobs aufgeteilt, in denen Sie definieren, dass Sie die Logik reduzieren.
  3. Für Ihren speziellen Fall, wie ich im vorhergehenden Punkt erwähnt habe, würden alle Ausgänge durch den Schlüssel gruppiert werden, die auf das erste Wort der Ausgabe beziehen werden:

Maschine A: hallo 1, Wort 1, Daten 1

Maschine B: Hallo 1, xu 2

Reducer input: Daten {1}, {1,1} Hallo, word {1}, {2} xu

Weitere Details MapReduce in diesem article

+0

Danke. Die Ergebnisse aller Mapper werden also gruppiert. Wird diese Ausgabe in einer einzelnen Datei oder mehreren Dateien gespeichert und wo befinden sich diese Dateien? –

+0

@shijiexu Diese Ausgabe wird in einem temporären Zwischenspeicher gespeichert, der in der Einstellung "mapreduce.cluster.temp.dir" definiert ist. Dieser Speicherort befindet sich außerhalb von HDFS, um Replikationsoverhead zu vermeiden. Dann nimmt Reducer diese Ausgaben auf und verarbeitet sie durch Mischen, Sortieren und Reduzieren der Bühne - https://hadoop.apache.org/docs/r2.6.2/api/org/apache/hadoop/mapreduce/Reducer.html – Alex

1

Sobald die Karte Aufgabe für einen Job erledigt ist dann der Ausgang gespeichert und dann zu Partitioner class übertragen wird diese Klasse zur Trennung von Daten gemäß den Reduzierungen verantwortlich ist. In Ihrem Fall haben Sie beispielsweise 3 Maschinen, auf denen Sie 2 Reduzierstücke laufen lassen. Dann ist die partition() -Methode der Partitionierungsklasse verantwortlich für das Teilen der Kartenausgabe für diesen 2 Reduzierer Ex-> Hallo 1 // Reduzierer 1 Wort 1// Reduzierer 2 Daten 1 // Reduzierer 1

Es werden nun 2 getrennte Dateien für jeden Reduzierer erstellt. Keine der auf jedem Mapperknoten erzeugten Dateien hängt davon ab, ob die Kartenausgabe Daten für jeden Reduzierer enthält oder nicht Bis jetzt sind alle diese Dateien auf dem Mapper-Knoten gespeichert.

Danach wird die Klasse WritableComapartor aufgerufen, die für das Sortieren der Daten in jeder der beiden Dateien zuständig ist und auch für deren Gruppierung zuständig ist. Sobald dies erledigt ist, können die resultierenden Dateien an die entsprechenden Knoten im Cluster gesendet werden.

Nach dem Mischen und Sortieren, in dem alle Kartenknoten die resultierenden Ausgabedateien auf dem jeweiligen Reduzierknoten senden, dann auf dem Reduzierer die Dateien von allen Mapper erhalten zusammengeführt und sortieren Ex -> so gibt es 2 Mapper und 2 Reduzierer und ein Mapper erzeugen Daten für sowohl Reduzierer 1 als auch Reduzierer 2, andere erzeugte nur eine Ausgabedatei, die für Reduzierer 1 ist, dann wird Reduzierer 1 zwei Dateien erhalten, und Reduzierer 2 wird 1 Datei erhalten.

Nach dem Zusammenführen und Sortieren wird Reducer über diese Dateien ausgeführt und die endgültige Ausgabe wird generiert.

Refer here for more detail about data flow from mapper to reducer

+0

danke für deine Antworten. es ist viel klarer –

0

Ein Mapper Ausgang lokal durch Schlüssel (für Wort in diesem Fall) sortiert wird, dann wird es in mehrere Stücke unterteilt (Anzahl von Chunks ist auf der Anzahl der Reduzierstücke oder weniger gleich, wenn diese bestimmte Ausgabe Mapper hat keine Schlüssel für bestimmte Reduzierungen). Danach geht jeder Chunk zu einem entsprechenden Reducer (der auch Datenstücke von den anderen Mappern empfängt), wo er mit den anderen Chunks der anderen Mapper zusammengeführt wird und dann geht alles als Eingabe zum Reducer.

Verwandte Themen