Ich höre viel über Map / Reduce, insbesondere im Zusammenhang mit Googles massiv parallelem Rechensystem. Was genau ist das?
language-agnostic
mapreduce
Lawrence Dol
quelle
quelle
Antworten:
Aus der Zusammenfassung der MapReduce- Forschungspublikationsseite von Google :
Der Vorteil von MapReduce besteht darin, dass die Verarbeitung parallel auf mehreren Verarbeitungsknoten (mehreren Servern) ausgeführt werden kann, sodass das System sehr gut skaliert werden kann.
Da es auf dem funktionalen Programmiermodell basiert , haben die Schritte
map
undreduce
keine Nebenwirkungen (der Status und die Ergebnisse der einzelnen Unterabschnitte einesmap
Prozesses hängen nicht von einem anderen ab), sodass der Datensatz, der abgebildet und reduziert wird, getrennt werden kann über mehrere Verarbeitungsknoten.Joel's Kann Ihre Programmiersprache dies tun? In diesem Artikel wird erläutert, wie wichtig es war, die funktionale Programmierung in Google zu verstehen, um MapReduce zu entwickeln, das die Suchmaschine antreibt. Es ist eine sehr gute Lektüre, wenn Sie mit der funktionalen Programmierung nicht vertraut sind und wissen, wie sie skalierbaren Code ermöglicht.
Siehe auch: Wikipedia: MapReduce
Verwandte Frage: Bitte erklären Sie mapreduce einfach
quelle
MapReduce erklärt .
Es erklärt besser als ich kann. Hilft es?
quelle
Map ist eine Funktion, die eine andere Funktion auf alle Elemente in einer Liste anwendet, um eine weitere Liste mit allen Rückgabewerten zu erstellen. (Eine andere Möglichkeit, "f auf x anwenden" zu sagen, ist "f aufrufen, x übergeben". Manchmal klingt es also besser, "anwenden" anstelle von "aufrufen" zu sagen.)
So wird map wahrscheinlich in C # geschrieben (es heißt
Select
und befindet sich in der Standardbibliothek):Da Sie ein Java-Typ sind und Joel Spolsky GROSSLY UNFAIR LIES gerne erzählt, wie beschissen Java ist (eigentlich lügt er nicht, es ist beschissen, aber ich versuche, Sie für sich zu gewinnen), ist hier mein sehr grober Versuch eine Java-Version (Ich habe keinen Java-Compiler und erinnere mich vage an Java-Version 1.1!):
Ich bin sicher, dass dies auf millionenfache Weise verbessert werden kann. Aber es ist die Grundidee.
Reduzieren ist eine Funktion, die alle Elemente in einer Liste in einen einzigen Wert umwandelt. Dazu muss eine andere Funktion
func
zugewiesen werden, die zwei Elemente in einen einzigen Wert verwandelt. Es würde funktionieren, wenn man die ersten beiden Punkte an gibtfunc
. Dann das Ergebnis davon zusammen mit dem dritten Punkt. Dann das Ergebnis davon mit dem vierten Element und so weiter, bis alle Elemente verschwunden sind und wir einen Wert haben.In C # wird reduzieren aufgerufen
Aggregate
und befindet sich wieder in der Standardbibliothek. Ich werde direkt zu einer Java-Version springen:Diese Java-Versionen müssen durch Generika ergänzt werden, aber ich weiß nicht, wie das in Java geht. Aber Sie sollten in der Lage sein, ihnen anonyme innere Klassen zu übergeben, um die Funktoren bereitzustellen:
Hoffentlich würden Generika die Abgüsse loswerden. Das typsichere Äquivalent in C # lautet:
Warum ist das "cool"? Einfache Möglichkeiten, größere Berechnungen in kleinere Teile zu zerlegen, damit sie auf unterschiedliche Weise wieder zusammengesetzt werden können, sind immer cool. Google wendet diese Idee auf die Parallelisierung an, da sowohl Map als auch Reduce auf mehrere Computer verteilt werden können.
Die wichtigste Voraussetzung ist jedoch NICHT, dass Ihre Sprache Funktionen als Werte behandeln kann. Das kann jede OO-Sprache. Die eigentliche Voraussetzung für die Parallelisierung ist, dass die kleinen
func
Funktionen, die Sie an die Zuordnung und Reduzierung übergeben, keinen Status verwenden oder aktualisieren dürfen. Sie müssen einen Wert zurückgeben, der nur von den an sie übergebenen Argumenten abhängt. Andernfalls werden die Ergebnisse völlig durcheinander gebracht, wenn Sie versuchen, das Ganze parallel auszuführen.quelle
Nachdem ich entweder mit sehr langen Waffeln oder sehr kurzen vagen Blog-Posts am meisten frustriert war, entdeckte ich schließlich dieses sehr gute, strenge, prägnante Papier .
Dann habe ich es durch die Übersetzung in Scala präziser gestaltet, wo ich den einfachsten Fall angegeben habe, in dem ein Benutzer einfach nur die
map
undreduce
Teile der Anwendung spezifiziert . In Hadoop / Spark wird streng genommen ein komplexeres Programmiermodell verwendet, bei dem der Benutzer explizit vier weitere Funktionen angeben muss, die hier beschrieben werden: http://en.wikipedia.org/wiki/MapReduce#Dataflowquelle
MapReduce und / oder SQL:
http://www.data-miners.com/blog/2008/01/mapreduce-and-sql-aggregations.html
http://www.data-miners.com/blog/
Kritik an MapReduce
http://www.databasecolumn.com/2008/01/mapreduce-a-major-step-back.html
http://www.databasecolumn.com/2008/01/mapreduce-continued.html
quelle
Map ist eine native JS-Methode, die auf ein Array angewendet werden kann. Es erstellt ein neues Array als Ergebnis einer Funktion, die jedem Element im ursprünglichen Array zugeordnet ist. Wenn Sie also eine Funktion (ein Element) {return element * 2;} zuordnen, wird ein neues Array zurückgegeben, wobei jedes Element verdoppelt wird. Das ursprüngliche Array würde unverändert bleiben.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Reduzieren ist eine native JS-Methode, die auch auf ein Array angewendet werden kann. Es wendet eine Funktion auf ein Array an und hat einen anfänglichen Ausgabewert, der als Akkumulator bezeichnet wird. Es durchläuft jedes Element im Array, wendet eine Funktion an und reduziert sie auf einen einzelnen Wert (der als Akkumulator beginnt). Dies ist nützlich, da Sie jede gewünschte Ausgabe haben können. Sie müssen nur mit dieser Art von Akkumulator beginnen. Wenn ich also etwas in ein Objekt reduzieren wollte, würde ich mit einem Akkumulator {} beginnen.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=a
quelle
Karte verkleinern:
Um etwas Großes auszuführen, können wir die Rechenleistung verschiedener Computer in unserem Büro verwenden. Der schwierige Teil besteht darin, die Aufgabe auf verschiedene Computer aufzuteilen. Dies erfolgt über die MapReduce-Bibliothek.
Die Grundidee ist, dass Sie den Job in zwei Teile teilen: eine Karte und eine Reduzieren. Map nimmt das Problem im Grunde genommen auf, teilt es in Unterteile auf und sendet die Unterteile an verschiedene Maschinen - so dass alle Teile gleichzeitig ausgeführt werden. Reduzieren nimmt die Ergebnisse aus den Unterteilen und kombiniert sie wieder, um eine einzige Antwort zu erhalten.
Die Eingabe ist eine Liste von Datensätzen. Das Ergebnis der Kartenberechnung ist eine Liste von Schlüssel / Wert-Paaren. Reduzieren verwendet jeden Wertesatz mit demselben Schlüssel und kombiniert sie zu einem einzigen Wert. Sie können nicht feststellen, ob der Job in 100 oder 2 Teile aufgeteilt wurde. Das Endergebnis ähnelt dem Ergebnis einer einzelnen Karte.
Bitte schauen Sie sich die einfache Karte an und reduzieren Sie das Programm:
Die Kartenfunktion wird verwendet, um eine Funktion auf unsere ursprüngliche Liste anzuwenden, und daher wird eine neue Liste generiert. Die map () -Funktion in Python verwendet eine Funktion und eine Liste als Argument. Eine neue Liste wird zurückgegeben, indem auf jedes Listenelement eine Funktion angewendet wird.
Die Funktion redu () in Python verwendet eine Funktion und eine Liste als Argument. Die Funktion wird mit einer Lambda-Funktion und einer Liste aufgerufen und ein neues reduziertes Ergebnis zurückgegeben. Dies führt eine sich wiederholende Operation über die Paare der Liste aus.
quelle