Wann beginnen in Hadoop reduzierte Aufgaben? Beginnen sie, nachdem ein bestimmter Prozentsatz (Schwellenwert) der Mapper abgeschlossen ist? Wenn ja, ist dieser Schwellenwert festgelegt? Welche Art von Schwelle wird normalerweise verwendet?
Die Reduktionsphase besteht aus 3 Schritten: Mischen, Sortieren, Reduzieren. Beim Mischen werden die Daten vom Reduzierer von jedem Mapper erfasst. Dies kann passieren, während Mapper Daten generieren, da es sich nur um eine Datenübertragung handelt. Auf der anderen Seite kann das Sortieren und Reduzieren erst gestartet werden, wenn alle Mapper fertig sind. Anhand des Prozentsatzes für die Fertigstellung des Reduzierers können Sie erkennen, welche MapReduce-Aktion ausgeführt wird: 0-33% bedeutet, dass der Shuffle ausgeführt wird, 34-66% sind sortiert, 67% -100% sind reduziert. Dies ist der Grund, warum Ihre Reduzierer manchmal bei 33% "stecken bleiben" - es wartet darauf, dass die Mapper fertig sind.
Reduzierungen beginnen mit dem Mischen basierend auf einem Schwellenwert für den Prozentsatz der fertiggestellten Mapper. Sie können den Parameter ändern, damit die Reduzierungen früher oder später gestartet werden.
Warum ist es gut, die Reduzierungen frühzeitig zu starten? Weil es die Datenübertragung von den Mappern zu den Reduzierern im Laufe der Zeit verteilt, was eine gute Sache ist, wenn Ihr Netzwerk der Engpass ist.
Warum ist es schlecht, die Reduzierungen früh zu starten? Weil sie "Slots" machen, reduzieren sie die Slots, während sie nur Daten kopieren und darauf warten, dass die Mapper fertig sind. Ein anderer Job, der später beginnt und tatsächlich die reduzierten Slots verwendet, kann sie jetzt nicht verwenden.
Sie können den Start der Reduzierungen anpassen, indem Sie den Standardwert von mapred.reduce.slowstart.completed.maps
in ändern mapred-site.xml
. Ein Wert von 1.00
wartet darauf, dass alle Mapper fertig sind, bevor die Reduzierungen gestartet werden. Ein Wert von 0.0
startet die Reduzierungen sofort. Ein Wert von 0.5
startet die Reduzierungen, wenn die Hälfte der Mapper vollständig ist. Sie können auch mapred.reduce.slowstart.completed.maps
von Job zu Job wechseln . In neuen Versionen von Hadoop (mindestens 2.4.1) wird der Parameter aufgerufenmapreduce.job.reduce.slowstart.completedmaps
(danke Benutzer yegor256).
Normalerweise möchte ich mapred.reduce.slowstart.completed.maps
oben bleiben, 0.9
wenn auf dem System jemals mehrere Jobs gleichzeitig ausgeführt werden. Auf diese Weise verschlingt der Job keine Reduzierungen, wenn sie nur Daten kopieren. Wenn immer nur ein Job gleichzeitig ausgeführt wird, ist dies 0.1
wahrscheinlich angemessen.
Die Reduktionsphase kann lange vor dem Aufruf eines Reduzierers beginnen. Sobald "ein" Mapper den Job beendet, werden die generierten Daten sortiert und gemischt (einschließlich Aufruf von Combiner und Partitionierer). Die "Phase" des Reduzierers beginnt in dem Moment, in dem die Datenverarbeitung nach dem Mapper gestartet wird. Wenn diese Verarbeitung abgeschlossen ist, werden Sie Fortschritte beim Prozentsatz der Reduzierungen sehen. Es wurde jedoch noch keiner der Reduzierer hinzugezogen. Abhängig von der Anzahl der verfügbaren / verwendeten Prozessoren, der Art der Daten und der Anzahl der erwarteten Reduzierungen möchten Sie den Parameter möglicherweise wie oben von @ Donald-Miner beschrieben ändern.
quelle
Soweit ich weiß, beginnt die Phase "Reduzieren" mit der Kartenphase und verbraucht weiterhin die Aufzeichnung von Karten. Da es jedoch nach der Kartenphase eine Sortier- und Mischphase gibt, müssen alle Ausgänge sortiert und an den Reduzierer gesendet werden. Logischerweise können Sie sich vorstellen, dass die Reduzierungsphase erst nach der Kartenphase beginnt, aber aus Leistungsgründen werden Reduzierungen auch mit den Mappern initialisiert.
quelle
Der für die Reduzierungsphase angezeigte Prozentsatz entspricht tatsächlich der Menge der Daten, die aus den Kartenausgängen in die Reduzierereingabeverzeichnisse kopiert wurden. Um zu wissen, wann dieser Kopiervorgang beginnt? Es ist eine Konfiguration, die Sie wie oben gezeigt einstellen können. Sobald alle Daten in Reduzierungen kopiert wurden (dh 100% reduzieren), beginnen die Reduzierungen zu arbeiten und können daher "100% reduzieren" einfrieren, wenn Ihr Reduzierungscode E / A- oder CPU-intensiv ist.
quelle
Reduzieren startet erst, nachdem alle Mapper ihre Aufgabe gefischt haben. Reduzieren muss mit allen Mappern kommunizieren, damit es warten muss, bis der letzte Mapper seine Aufgabe beendet hat. Der Mapper beginnt jedoch mit der Datenübertragung, sobald er seine Aufgabe abgeschlossen hat.
quelle
Betrachten Sie ein WordCount-Beispiel, um besser zu verstehen, wie die Map-Reduction-Aufgabe funktioniert. Angenommen, wir haben eine große Datei, beispielsweise einen Roman, und unsere Aufgabe besteht darin, die Häufigkeit zu ermitteln, mit der jedes Wort in der Datei vorkommt. Da die Datei groß ist, kann sie in verschiedene Blöcke unterteilt und in verschiedenen Arbeitsknoten repliziert werden. Der Wortzähljob besteht aus Zuordnungs- und Reduzierungsaufgaben. Die Zuordnungsaufgabe nimmt jeden Block als Eingabe und erzeugt ein Zwischenschlüssel-Wert-Paar. In diesem Beispiel würde der Mapper während der Verarbeitung eines Blocks zu Zwischenergebnissen der Form (word1, count1), (word2, count2) usw. führen, da wir die Anzahl der Vorkommen von Wörtern zählen. Das Zwischenergebnis aller Mapper ist durchlief eine Shuffle-Phase, die das Zwischenergebnis neu ordnet.
Angenommen, unsere Kartenausgabe von verschiedenen Mappern hat die folgende Form:
Karte 1: - (ist, 24) (war, 32) (und, 12)
Karte 2: - (meine, 12) (ist, 23) (war, 30)
Die Kartenausgänge sind so sortiert, dass dem gleichen Reduzierer dieselben Schlüsselwerte zugewiesen werden. Hier würde es bedeuten, dass die Schlüssel, die is, was usw. entsprechen, denselben Reduzierer haben. Es ist der Reduzierer, der die endgültige Ausgabe erzeugt, was in diesem Fall sein würde: - (und, 12) (ist, 47) (my, 12 ) (war 62)
quelle
Reduzieraufgaben beginnen erst nach
completion
allen Mappern.Die Datenübertragung erfolgt jedoch nach
each
Map. Eigentlich ist es eine Pull-Operation.Das bedeutet, dass jedes Mal, wenn der Reduzierer jede Mappask fragt, ob er Daten hat, die von Map abgerufen werden können. Wenn er feststellt, dass ein Mapper seine Aufgabe erfüllt hat, zieht der Reduzierer die Zwischendaten.
Die Zwischendaten von Mapper werden in gespeichert
disk
. Die Datenübertragung von Mapper zu Reduce erfolgt über das Netzwerk (Data Locality
wird in der Reduce-Phase nicht beibehalten).quelle
Wenn Mapper seine Aufgabe beendet hat, startet Reducer seinen Job, um die Daten zu reduzieren. Dies ist ein Mapreduce-Job.
quelle