Das Teilen eines Problems in kleinere, bis die einzelnen Probleme unabhängig voneinander gelöst werden können, und das anschließende Kombinieren dieser Probleme zur Beantwortung der ursprünglichen Frage wird als Entwurfstechnik für den Teilungs- und Eroberungsalgorithmus bezeichnet . [Siehe: Einführung in Algorithmen von CLR]
In letzter Zeit wurde dieser Ansatz zur Lösung von Rechenproblemen, insbesondere im Bereich sehr großer Datenmengen, eher als MapReduce als als Teilen und Erobern bezeichnet.
Meine Frage lautet wie folgt: Ist MapReduce mehr als ein proprietäres Framework, das auf dem Divide and Conquer-Ansatz beruht, oder gibt es Details, die es in gewisser Hinsicht einzigartig machen?
algorithms
otto
quelle
quelle
Antworten:
Wenn Sie sich nach der MapReduce-Architektur erkundigen, handelt es sich eigentlich nur um eine Divide-and-Conquer- Technik. In jeder nützlichen MapReduce-Architektur sind jedoch Berge anderer Infrastrukturen vorhanden, um das Problem effizient zu "teilen", zu "erobern" und schließlich zu "reduzieren". Bei einer umfangreichen MapReduce-Bereitstellung (Tausende von Rechenknoten) sind diese Schritte zum Aufteilen der Arbeit, zum Berechnen und schließlich zum Sammeln aller Ergebnisse nicht trivial. Dinge wie Lastausgleich, Erkennung toter Knoten und Speichern des Zwischenzustands (bei Problemen mit langer Laufzeit) sind für sich genommen schwierige Probleme.
quelle
MapReduce ist ein Framework zur extrem skalierbaren Implementierung von Divide-and-Conquer-Algorithmen, bei dem Arbeitseinheiten automatisch auf Knoten in einem beliebig großen Cluster von Computern verteilt und Ausfälle einzelner Knoten durch Neuverteilung der Arbeitseinheiten automatisch behandelt werden zu einem anderen Knoten.
Es ist kein hochentwickeltes Konzept, sondern eine sehr nützliche Infrastruktur.
quelle
MapReduce unterscheidet sich in ziemlich grundlegender Weise von den meisten Divide- und Conquer-Systemen, aber eines, das so einfach ist, dass viele Leute es fast übersehen. Das wahre Genie besteht darin, die Zwischenergebnisse zu markieren.
In einem typischen (vorherigen) Divide and Conquer-System teilen Sie die Arbeit nacheinander auf, führen Arbeitspakete parallel aus und führen die Ergebnisse dieser Arbeit nacheinander wieder zusammen.
In MapReduce teilen Sie die Arbeit nacheinander auf, führen Arbeitspakete parallel aus und markieren die Ergebnisse, um anzugeben, welche Ergebnisse zu welchen anderen Ergebnissen passen. Das Zusammenführen erfolgt dann seriell für alle Ergebnisse mit demselben Tag, kann jedoch für Ergebnisse mit unterschiedlichen Tags parallel ausgeführt werden.
In den meisten früheren Systemen wurde der Zusammenführungsschritt zu einem Engpass für alle Aufgaben, mit Ausnahme der wirklich trivialen. Mit MapReduce kann es immer noch vorkommen, dass aufgrund der Art der Aufgaben alle Zusammenführungen seriell ausgeführt werden müssen. Wenn die Aufgabe jedoch ein gewisses Maß an paralleler Zusammenführung von Ergebnissen zulässt, bietet MapReduce eine einfache Möglichkeit, diese Möglichkeit zu nutzen. Die meisten anderen Systeme führen eine der beiden folgenden Aktionen aus: Führen Sie die Zusammenführung entweder nacheinander aus, nur weil dies für einige Aufgaben erforderlich sein könnte , oder definieren Sie die parallele Zusammenführung für eine bestimmte Aufgabe statisch. Mit MapReduce erhalten Sie im Zusammenführungsschritt genügend Daten, um so viele Daten wie möglich automatisch parallel einzuplanen, und stellen gleichzeitig sicher, dass die Kohärenz erhalten bleibt (vorausgesetzt, Sie haben im Zuordnungsschritt keine Fehler gemacht).
Beachten Sie auch, dass in MapReduce alle Schritte rekursiv sein können, sodass ich möglicherweise einen ersten Zuordnungsschritt habe, der eine große Aufgabe in 5 kleinere Aufgaben aufteilt, die parallel ausgeführt werden können - aber jede dieser Aufgaben kann (in turn) wird auf eine Reihe anderer kleinerer paralleler Aufgaben abgebildet, und so weiter.
Dies führt zu einer Baumstruktur sowohl auf der Zuordnungs- als auch auf der Verkleinerungsseite, um eine große Aufgabe schnell in genügend Teile zu zerlegen, um die Vorteile vieler Maschinen nutzen zu können.
quelle
MapReduce ist nicht einfach eine Divide-and-Conquer-Technik, obwohl dies in vielen Beispielen so aussieht.
Im Zuordnungsschritt können und möchten Sie häufig eine Eins-zu-Viele-Beziehung erstellen. Sie unterteilen also nicht einfach in Fälle.
Zwischen Map und Reduce gibt es entweder (je nach Implementierung) einen Sortier- oder einen Hashing-Schritt. Die Effizienz dieses Vorgangs ist für den gesamten Ressourcenbedarf äußerst wichtig. Die Details sind für den Anwendungsprogrammierer nicht sichtbar, aber dieser Schritt ist das Herzstück des Frameworks.
Die Reduktionsoperation ist eine Art Zusammenführung. Was man sich als Eroberung vorstellen kann, in der Praxis aber eher "Daten zur späteren Verwendung ausgeben" oder "Daten in einem Datenspeicher speichern" lautet. (Wenn Sie große Datenmengen haben, möchten Sie wirklich, dass alles verteilt wird, einschließlich der Eingabe und der Endergebnisse. Daher ist ein verteilter Schlüssel- / Wertspeicher sowohl als Ort zum Abrufen der Eingabe als auch zum Speichern der Ausgabe sinnvoll.)
quelle