Was ist der Zweck der Misch- und Sortierphase im Reduzierer in der Map Reduce-Programmierung?


113

In der Map Reduce-Programmierung hat die Reduktionsphase das Mischen, Sortieren und Reduzieren als Unterteile. Sortieren ist eine kostspielige Angelegenheit.

Was ist der Zweck der Misch- und Sortierphase im Reduzierer in der Map Reduce-Programmierung?


3
Ich habe immer angenommen, dass dies notwendig ist, da die Ausgabe vom Mapper die Eingabe für den Reduzierer ist. Daher wurde sie nach dem Schlüsselbereich sortiert und dann für jede Reduzierereingabe in Buckets aufgeteilt.
BasicHorizon

Antworten:


171

Zuerst shuffling geht es darum, Daten von den Mappern zu den Reduzierern zu übertragen. Ich denke, es ist offensichtlich, dass dies für die Reduzierer notwendig ist, da sie sonst keine Eingabe (oder Eingabe von jedem Mapper) erhalten könnten. . Das Mischen kann bereits vor Abschluss der Kartenphase beginnen, um Zeit zu sparen. Aus diesem Grund wird ein Reduzierungsstatus von mehr als 0% (aber weniger als 33%) angezeigt, wenn der Kartenstatus noch nicht 100% beträgt.

Sortingspart Zeit für den Reduzierer und hilft ihm leicht zu erkennen, wann eine neue Reduzierungsaufgabe beginnen sollte. Es wird einfach eine neue Reduzierungsaufgabe gestartet, wenn der nächste Schlüssel in den sortierten Eingabedaten anders ist als der vorherige, um es einfach auszudrücken. Jede Reduktionsaufgabe benötigt eine Liste von Schlüssel-Wert-Paaren, muss jedoch die Methode redu () aufrufen, die eine Eingabe für die Schlüsselliste (Wert) akzeptiert, sodass Werte nach Schlüssel gruppiert werden müssen. Dies ist einfach, wenn die Eingabedaten in der Kartenphase (lokal) vorsortiert und in der Reduzierungsphase einfach zusammengeführt werden (da die Reduzierer Daten von vielen Mappern erhalten).

Partitioning, die Sie in einer der Antworten erwähnt haben, ist ein anderer Prozess. Es bestimmt, in welchem ​​Reduzierer ein (Schlüssel-, Wert-) Paar, Ausgabe der Kartenphase, gesendet wird. Der Standard-Partitionierer verwendet ein Hashing für die Schlüssel, um sie an die Reduzierungsaufgaben zu verteilen. Sie können es jedoch überschreiben und Ihren eigenen benutzerdefinierten Partitionierer verwenden.

Eine gute Informationsquelle für diese Schritte ist dieses Yahoo-Tutorial .

Eine schöne grafische Darstellung davon ist die folgende (Shuffle wird in dieser Abbildung als "Kopie" bezeichnet):

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass shufflingund sortingüberhaupt nicht ausgeführt werden, wenn Sie Nullreduzierer angeben (setNumReduceTasks (0)). Dann stoppt der MapReduce-Job in der Kartenphase, und die Kartenphase enthält keine Sortierung (sodass selbst die Kartenphase schneller ist).

UPDATE: Da Sie nach etwas Offiziellerem suchen, können Sie auch Tom Whites Buch "Hadoop: The Definitive Guide" lesen. Hier ist der interessante Teil für Ihre Frage.
Tom White ist seit Februar 2007 ein Apache Hadoop-Committer und Mitglied der Apache Software Foundation. Ich denke, es ist ziemlich glaubwürdig und offiziell ...


"Das Sortieren spart dem Reduzierer Zeit und hilft ihm, leicht zu erkennen, wann eine neue Reduzierungsaufgabe gestartet werden soll. Es startet einfach eine neue Reduzierungsaufgabe, wenn der nächste Schlüssel in den sortierten Eingabedaten anders ist als der vorherige, um es einfach auszudrücken." Ich verstehe diesen Teil nicht. Mapper verwendet einen Partitionierer, um Verschüttungen lokal in Partitionen zu unterteilen. Jede Partition wird dann an eine Reduzierung gesendet. Wie hilft hier das Sortieren?
MaxNevermind

1
@MaxNevermind Wenn Sie x Reduce-Tasks (Partitionen) haben, bedeutet dies nicht, dass Sie am Ende die redu () -Methode x-mal aufrufen. Es wird einmal für jeden einzelnen Schlüssel aufgerufen. Eine Reduktionsaufgabe kann also die Methode redu () mehrmals aufrufen.
Vefthym

"Es wird einmal für jeden einzelnen Schlüssel aufgerufen" Warum? Mapper bildet Partitionen, wie es will (nicht eine Partition für jeden einzelnen Schlüssel erforderlich), dann geht jede Partition an Reducer, ist das falsch?
MaxNevermind

1
@MaxNevermind Mapper gibt Schlüssel und Werte aus und bildet keine Partitionen. Die Partitionen werden durch die Anzahl der vom Benutzer definierten Reduzierungsaufgaben und die Partitioner-Implementierung definiert. Die Ausgaben aller Mapper mit demselben Schlüssel werden mit derselben redu () -Methode ausgeführt. Dies kann nicht geändert werden. Es kann jedoch geändert werden, welche anderen Schlüssel (falls vorhanden) in derselben Partition abgelegt werden und somit von derselben Aufgabe behandelt werden. Eine Reduktionsaufgabe kann die Funktion redu () mehrmals aufrufen, jedoch nur einmal für jede Taste.
Vefthym

2
ok ich denke ich habe es. Mein Problem war, dass ich vergessen habe, dass Reduzieren eine Werteliste als Argument verwendet, nicht nur ein Schlüssel-Wert-Paar. Ich denke, Sie sollten dies in Ihrer Antwort näher erläutern: "Jede Reduktionsaufgabe benötigt eine Liste von Schlüssel-Wert-Paaren, muss jedoch die Reduktionsmethode aufrufen, die eine Schlüsselliste <Wert> verwendet, sodass Werte einfach nach Schlüssel gruppiert werden müssen. Das ist einfach zu tun, wenn Eingabedaten in einer Mapper-Phase vorsortiert sind "
MaxNevermind

42

Lassen Sie uns die wichtigsten Phasen des Mapreduce-Programms noch einmal betrachten.

Die Kartenphase wird von Mappern durchgeführt. Mapper werden mit unsortierten Eingabe-Schlüssel / Wert-Paaren ausgeführt. Jeder Mapper gibt für jedes Eingabeschlüssel / Wert-Paar null, eins oder mehrere Ausgabeschlüssel / Wert-Paare aus.

Die Mähdrescherphase wird von Kombinierern durchgeführt. Der Kombinierer sollte Schlüssel / Wert-Paare mit demselben Schlüssel kombinieren. Jeder Kombinierer kann null, einmal oder mehrmals ausgeführt werden.

Die Shuffle- und Sortierphase wird vom Framework durchgeführt. Daten von allen Mappern werden nach dem Schlüssel gruppiert, auf Reduzierungen aufgeteilt und nach dem Schlüssel sortiert. Jeder Reduzierer erhält alle Werte, die demselben Schlüssel zugeordnet sind. Der Programmierer kann benutzerdefinierte Vergleichsfunktionen zum Sortieren und einen Partitionierer zum Aufteilen von Daten bereitstellen .

Der Partitionierer entscheidet, welcher Reduzierer ein bestimmtes Schlüsselwertpaar erhält.

Der Reduzierer erhält sortierte Schlüssel / [Werteliste] -Paare, sortiert nach dem Schlüssel. Die Werteliste enthält alle Werte mit demselben Schlüssel, die von Mappern erstellt wurden. Jeder Reduzierer gibt für jedes Eingangsschlüssel / Wert-Paar null, einen oder mehrere Ausgangsschlüssel / Wert-Paare aus .

Schauen Sie sich zum besseren Verständnis diesen javacodegeeks- Artikel von Maria Jurcovicova und den mssqltips- Artikel von Datta an

Unten ist das Bild aus dem Artikel von safaribooksonline

Geben Sie hier die Bildbeschreibung ein


Ich denke, es gibt einen Tippfehler im Bild (von dem ich weiß, dass er nur hier kopiert wird). Ich glaube, die ieZeichenfolgen unter Reduzierer und Ausgabe sollten eigentlich sein is.
Jeff Evans

32

Ich dachte daran, nur einige Punkte hinzuzufügen, die in den obigen Antworten fehlen. Dieses Diagramm von hier zeigt deutlich, was wirklich los ist.

Geben Sie hier die Bildbeschreibung ein

Wenn ich noch einmal den wahren Zweck von

  • Aufteilen: Verbessert die parallele Verarbeitung, indem die Verarbeitungslast auf verschiedene Knoten (Mapper) verteilt wird, wodurch die Gesamtverarbeitungszeit gespart wird.

  • Kombinieren: Verkleinert die Ausgabe jedes Mappers. Dies würde den Zeitaufwand für das Verschieben der Daten von einem Knoten auf einen anderen sparen.

  • Sortieren (Mischen & Sortieren): Erleichtert der Laufzeit das Planen (Spawn / Start) neuer Reduzierungen, wobei beim Durchlaufen der Liste sortierter Elemente immer dann, wenn sich der aktuelle Schlüssel vom vorherigen unterscheidet, ein neuer Reduzierer erzeugt werden kann .


Wo würde der Partitionsschritt in dieses Diagramm kommen? Nach Karte und vor Mähdrescher?
Joel

@ Joel Ich hoffe, Sie beziehen sich auf "Split" Schritt?
Supun Wijerathne

Nein, ich meine den Partitionsschritt. Er entscheidet, an welchen Reduzierer die Daten standardmäßig mit einem einfachen Hash-Modulo gesendet werden sollen. Nach weiteren Recherchen, glaube ich, erfolgt dies nach dem Kombinationsschritt, vor dem Mischen und Sortieren.
Joel

1
@ Joel Ich bin mir nicht ganz sicher, was du beschreiben willst. Kurz gesagt, die genaue Abfolge der Schritte kann ziemlich problemspezifisch sein. Ich kann sagen, dass für einige Szenarien nicht einmal eine Sortierung erforderlich ist. Zurück zu Ihrer Eingabe: Wenn ich speziell auf das obige einfache Beispiel für die Wortanzahl spreche, sehe ich keine Notwendigkeit für eine solche Partitionierung, um Reduzierungen zu bestimmen. Hier ist es ziemlich einfach, Reduzierungen pro Schlüssel zu erzeugen. Aber ich kann mir vorstellen, dass Ihr Standpunkt für einige Szenarien gültig sein kann. Ehrlich gesagt habe ich keine genaue Vorstellung davon.
Supun Wijerathne

4

Einige der Datenverarbeitungsanforderungen müssen überhaupt nicht sortiert werden. Syncsort hatte die Sortierung in Hadoop steckbar gemacht. Hier ist ein schöner Blog von ihnen zum Sortieren. Das Verschieben der Daten von den Mappern zu den Reduzierern wird als Mischen bezeichnet. Weitere Informationen hierzu finden Sie in diesem Artikel.


2

Ich habe immer angenommen, dass dies notwendig ist, da die Ausgabe vom Mapper die Eingabe für den Reduzierer ist. Daher wurde sie nach dem Schlüsselbereich sortiert und dann für jede Reduzierereingabe in Buckets aufgeteilt. Sie möchten sicherstellen, dass alle gleichen Werte eines Schlüssels im selben Eimer landen, der zum Reduzierer geht, damit sie zusammen reduziert werden. Es macht keinen Sinn, K1, V2 und K1, V4 an verschiedene Reduzierstücke zu senden, da diese zusammen sein müssen, um reduziert zu werden.

Versuchte es so einfach wie möglich zu erklären


Wenn wir k1, v1 und k1, v4 an denselben Reduzierer senden möchten, können wir mischen. Was ist dann der Zweck des Sortierens?
Nithin K Anil

Die Sortierung erfolgt aus mehreren Gründen. Ein Grund dafür ist, dass ein MapReduce-Job alle KV-Paare an einen Reduzierer sendet, wenn der Eingang nicht sortiert ist. Er müsste alle Mapper-Ausgänge scannen, um jede Instanz von K1, VX aufzunehmen . Wenn die Mapper-Ausgabe sortiert wird, sobald K2, VX aufgenommen wird, wissen Sie, dass alle K1, VX aufgenommen wurden und dieser Satz zur Verarbeitung an einen Reduzierer gesendet werden kann. Dies hat den Vorteil, dass Sie dies nicht tun müssen warten, bis jeder Reduzierer bereit ist, damit jeder von ihnen mit dem Reduzieren beginnt.
BasicHorizon

Auch wenn es um die Aggregation geht, wenn Sie angeben, dass Sie alle K1, V1 aggregieren möchten, wenn die Eingabe in den Reduzierer sortiert ist, sobald der Reduzierer K2, V2 aufnimmt, weiß er, dass keine Instanzen von K1, V1 mehr existieren es kann seine Aggregation beenden, während, wenn die Reduzierereingabe nicht sortiert ist, die gesamte Eingabe für K1, V1
BasicHorizon

2

Das Mischen ist der Prozess, bei dem Zwischendaten von Mappern an 0,1 oder mehr Reduzierer übertragen werden. Jedes Reduzierstück erhält je nach Anzahl der Reduzierstücke (für eine ausgeglichene Last) einen oder mehrere Schlüssel und die zugehörigen Werte. Ferner werden die jedem Schlüssel zugeordneten Werte lokal sortiert.


0

Es gibt nur zwei Dinge, die MapReduce NATIVELY macht: Sortieren und (nach Sortieren implementiert) skalierbares GroupBy.

Die meisten Anwendungen und Entwurfsmuster über MapReduce basieren auf diesen beiden Vorgängen, die durch Mischen und Sortieren bereitgestellt werden.


0

Dies ist eine gute Lektüre. Ich hoffe es hilft. In Bezug auf die Sortierung, die Sie betreffen, denke ich, dass dies für den Zusammenführungsvorgang im letzten Schritt von Map gilt. Wenn der Kartenvorgang abgeschlossen ist und das Ergebnis auf die lokale Festplatte geschrieben werden muss, werden die aus dem Puffer generierten Teilungen mehrfach zusammengeführt. Für einen Zusammenführungsvorgang ist es hilfreich, jede Partition in Advanced zu sortieren.


0

Nun, in Mapreduce gibt es zwei wichtige Sätze namens Mapper und Reducer. Beide sind zu wichtig, aber Reducer ist obligatorisch. In einigen Programmen sind Reduzierungen optional. Kommen Sie nun zu Ihrer Frage. Mischen und Sortieren sind zwei wichtige Vorgänge in Mapreduce. Das erste Hadoop-Framework verwendet strukturierte / unstrukturierte Daten und unterteilt die Daten in Schlüssel, Wert.

Jetzt trennt das Mapper-Programm die Daten und ordnet sie in zu verarbeitenden Schlüsseln und Werten an. Generieren Sie Werte für Schlüssel 2 und Wert 2. Diese Werte sollten in der richtigen Reihenfolge verarbeitet und neu angeordnet werden, um die gewünschte Lösung zu erhalten. Jetzt wird dieses Mischen und Sortieren in Ihrem lokalen System durchgeführt (Framework kümmert sich darum) und im lokalen System verarbeitet, nachdem das Prozess-Framework die Daten im lokalen System bereinigt hat. OK

Hier verwenden wir Combiner und Partition , um diesen Shuffle- und Sortierprozess zu optimieren. Nach ordnungsgemäßer Anordnung werden diese Schlüsselwerte an Reducer übergeben, um die gewünschte Client-Ausgabe zu erhalten. Schließlich erhält der Reduzierer die gewünschte Leistung.

K1, V1 -> K2, V2 (wir werden das Programm Mapper schreiben), -> K2, V '(hier werden die Daten gemischt und weich gemacht) -> K3, V3 Generieren Sie die Ausgabe. K4, V4.

Bitte beachten Sie, dass alle diese Schritte nur logisch sind und nicht die Originaldaten ändern.

Ihre Frage: Was ist der Zweck der Misch- und Sortierphase im Reduzierer in der Map Reduce-Programmierung?

Kurze Antwort: Um die Daten zu verarbeiten, um die gewünschte Ausgabe zu erhalten. Beim Mischen werden die Daten aggregiert, beim Reduzieren wird die erwartete Ausgabe abgerufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.