2013-06-18 6 views

Antwort

21

Einfach die Anzahl der Überläufe auf die Festplatte. Die Sortierung erfolgt nach dem MapOutputBuffer aufgefüllt, gleichzeitig findet die Zusammenführung statt.

einzustellen, können Sie die Zahl der Leckagen auf der Festplatte mit den Parametern io.sort.mb, io.sort.spill.percent, io.sort.record.percent - das ist auch in der Dokumentation (Bücher und Online-Ressourcen) erklärt.

Beispiel für bestimmte Anzahl von Kombinierer läuft:

0 -> kein Kombinierer

1 definiert wurde -> ein Kombinierer definiert wurde und die MapOutputBuffer gefüllt einmal

> 1 -> ein Kombinierer wurde definiert und die MapOutputBuffer gefüllt mehr als einmal

Beachten Sie, dass, auch wenn die MapOutputBuffer nev Wenn der Puffer vollständig gefüllt ist, muss dieser Puffer am Ende der Map-Phase geleert werden und löst somit den Combiner mindestens einmal aus (falls definiert).

+0

Danke für die Antwort, ich habe die Beschreibung dieser Konfigurationsparameter in der endgültigen Anleitung überprüft. Jetzt verstehe ich den Fall, wenn mehrere Combiner verwendet werden . Aber ich vermisse immer noch den Fall, wenn kein Combiner gestartet wird. Kannst du mir bitte dabei helfen? Ich verstehe den Anwendungsfall der unzureichenden Anzahl der Datensätze zu kombinieren, aber ich vermisse die Konfigs für es – banjara

+0

Kombinieren wird immer aufgerufen, wenn der Puffer gelöscht werden muss. Daher muss der Kombinierer (falls definiert) am Ende der Kartenstufe mindestens einmal laufen. Welche konkreten Probleme haben Sie? Ich bearbeitete und fügte einige Beispiele für Sie hinzu –

+1

Um meine MR-Jobs zu optimieren, habe ich über die Einführung von Combiner nachgedacht und ich habe über sie studiert. Ich habe in vielen Blogs gelesen, dass Combiners nicht garantiert laufen (http://dataworld.blog.com/2013/04/30/just-a-little-about-combiner-of-mapreduce-framework/). Ich habe noch eine Frage, Combiner wird pro Mapper oder pro Datenknotenmaschine gestartet ?? Ich habe geglaubt, dass der Combiner Teil der Mapper-Phase ist, aber http://developer.yahoo.com/hadoop/tutorial/module4.html schlägt vor, dass der Combiner pro Maschine gestartet wird.Können Sie bitte helfen – banjara

4

Zunächst ist die Antwort von Thomas Jungblut großartig, und ich gab sie auf. Die einzige Sache, die ich hinzufügen möchte, ist, dass der Combiner immer einmal mindestens einmal pro Mapper ausgeführt wird, sofern die Mapper-Ausgabe leer ist oder ein einzelnes Paar ist. Daher ist es möglich, aber nicht sehr wahrscheinlich, dass der Combiner im Mapper ausgeführt wird.

0

Quellcode mit Logik, die den Combiner basierend auf der Bedingung aufruft.

Linie 1950 - Linie 1955 https://github.com/apache/hadoop/blob/0b8a7c18ddbe73b356b3c9baf4460659ccaee095/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/MapTask.java

if (combinerRunner == null || numSpills < minSpillsForCombine) { 
    Merger.writeFile(kvIter, writer, reporter, job); 
} else { 
    combineCollector.setWriter(writer); 
    combinerRunner.combine(kvIter, combineCollector); 
} 

So Combiner läuft, wenn:

Es ist nicht definiert, und Wenn die Verschüttungen größer als minSpillsForCombine. minSpillForCombine wird von der Eigenschaft "mapreduce.map.combine.minspills" gesteuert, deren Standardwert 3 ist.