Ce qui est Map/reduce?
Je parle beaucoup de map/reduce, en particulier dans le contexte de Google massivement parallèle de calcul du système. Qu'est-il exactement?
- Néanmoins, c'est toujours une bonne question.
- Sûr que je pourrais et ne Google cela; mais (un) est DONC destiné à grandir pour avoir des réponses à toutes les questions importantes (nous incite encore à poster des questions à laquelle nous avons déjà les réponses) et (b) je voulais de cette communauté de prendre sur elle.
Vous devez vous connecter pour publier un commentaire.
De l'abrégé de Google MapReduce publications de la recherche page:
L'avantage de MapReduce est que le traitement peut être effectué en parallèle sur plusieurs nœuds de traitement (plusieurs serveurs) c'est donc un système capable de s'adapter très bien.
Puisque c'est sur la base de la programmation fonctionnelle modèle, la
map
etreduce
les étapes de chaque n'ont pas d'effets secondaires (l'état et les résultats de chaque paragraphe d'unmap
processus ne dépend pas d'une autre), de sorte que l'ensemble de données mappé et réduit peuvent être séparés sur plusieurs nœuds de traitement.Joël Votre Langage De Programmation Le Faire? pièce traite de la façon dont la compréhension de la programmation fonctionnelle a été essentiel dans Google pour venir avec MapReduce, qui alimente son moteur de recherche. C'est une très bonne lecture, si vous n'êtes pas familier avec la programmation fonctionnelle et comment il permet évolutive code.
Voir aussi: Wikipédia: MapReduce
Liés à la question: Veuillez expliquer mapreduce simplement
MapReduce Expliqué.
Il explique mieux que ce que je peux. Est-il utile?
Carte est une fonction qui applique une fonction à tous les éléments d'une liste, pour produire une liste avec toutes les valeurs de retour sur elle. (Une autre façon de dire "application de f à x" est "call f, passant de x". Alors parfois, il semble plus agréable de dire "appliquer" au lieu de "l'appel".)
C'est la façon dont la carte est probablement écrit en C# (on appelle
Select
et est dans la bibliothèque standard):Que vous êtes un Java mec, et Joel Spolsky aime raconter des INÉQUITABLES se trouve sur la façon misérable Java est (en fait, il n'est pas mentir, c'est merdique, mais je vais essayer de vous faire gagner plus), voici ma tentative très grossière à une version de Java (je n'ai pas de compilateur Java, et je me souviens vaguement de Java version 1.1!):
Je suis sûr que cela peut être amélioré en un million de façons. Mais c'est l'idée de base.
Réduire est une fonction qui transforme tous les éléments d'une liste en une seule valeur. Pour ce faire, il doit être donné une autre fonction
func
qui transforme les deux éléments en une seule valeur. Il travail en donnant les deux premiers éléments defunc
. Le résultat de ce avec la troisième élément. Le résultat de ce que le quatrième élément, et ainsi de suite jusqu'à ce que tous les éléments ont disparu et nous sommes à gauche, avec une valeur.En C# réduire est appelé
Aggregate
et est de nouveau dans la bibliothèque standard. Je vais passer directement à une version de Java:Ces versions de Java besoin génériques en ajoutant à eux, mais je ne sais pas comment le faire en Java. Mais vous devriez être capable de les transmettre anonyme intérieure classes pour fournir des foncteurs:
Espérons que les génériques serait de se débarrasser de la jette. Le typesafe équivalent en C# est:
Pourquoi est-ce "cool"? Des moyens simples pour casser les plus gros calculs en petits morceaux, de sorte qu'ils peuvent être combinés de différentes manières, sont toujours fraîches. La façon dont Google s'applique cette idée est à la parallélisation, parce que les deux map et reduce peut être partagée sur plusieurs ordinateurs.
Mais l'essentiel n'est PAS que votre langue traiter fonctions en tant que valeurs. Tout langage OO peut le faire. Le besoin réel pour la parallélisation est que le petit
func
fonctions que vous passez à la carte et de réduire ne doit pas utiliser ou mettre à jour n'importe quel état. Ils doivent retourner une valeur qui dépend seulement de l'argument(s) passé pour eux. Sinon, les résultats seront complètement foiré quand vous essayez d'exécuter l'ensemble de la chose en parallèle.Après l'obtention de la plupart des frustrés avec soit très long waffley ou à très courte vague de messages de blog, j'ai finalement découvert ce très bon rigoureux concis papier.
Alors je suis allé de l'avant et il est plus concis en traduisant dans la Scala, où j'ai fourni le plus simple des cas où un utilisateur, il suffit juste de précise le
map
etreduce
parties de l'application. Dans Hadoop/Spark, à proprement parler, un modèle plus complexe de la programmation est à l'emploi qui obligent l'utilisateur à spécifier explicitement les 4 plus des fonctions décrites ici: http://en.wikipedia.org/wiki/MapReduce#DataflowMapReduce et/ou SQL:
http://www.data-miners.com/blog/2008/01/mapreduce-and-sql-aggregations.html
http://www.data-miners.com/blog/
critique de MapReduce
http://www.databasecolumn.com/2008/01/mapreduce-a-major-step-back.html
http://www.databasecolumn.com/2008/01/mapreduce-continued.html
Carte est originaire JS méthode qui peut être appliquée à un tableau. Il crée un nouveau tableau en tant que résultat d'une fonction mappé à chaque élément dans le tableau d'origine. Donc, si vous avez mappé une function(element) { return element * 2;}, il serait de retour d'un nouveau tableau avec tous les éléments doublé. Le tableau d'origine irait non modifiée.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Réduire est originaire JS méthode peut également être appliquée à un tableau. Il applique une fonction à un tableau et a une première valeur de sortie appelé un accumulateur. Il parcourt chaque élément dans le tableau, s'applique à une fonction, et les réduit à une valeur unique (qui commence comme l'accumulateur). Il est utile parce que vous pouvez avoir n'importe quelle sortie vous le souhaitez, vous venez de commencer avec ce type d'accumulateur. Donc, si je voulais réduire quelque chose en objet, je voudrais commencer avec un accumulateur {}.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=a
MapReduce:
Pour exécuter quelque chose de grand, nous pouvons utiliser la puissance de calcul d'un autre ordinateur dans notre bureau. Partie la plus difficile est la tâche fractionnée entre plusieurs ordinateurs.Il est fait par MapReduce bibliothèque.
L'idée de base est que vous diviser le travail en deux parties: une Carte, et un à Réduire. La carte prend le problème, la divise en sous-parties, et envoie les sous-parties de machines différentes – de sorte que tous les morceaux s'exécuter en même temps. Réduire prend les résultats de la sous-parties, et de les combiner ensemble pour obtenir une réponse unique.
D'entrée est une liste d'enregistrements.Résultat de la carte, le calcul est une liste de paires clé/valeur. Réduire prend chaque ensemble de valeurs qui a la même clé, et les combine en une seule valeur.Vous ne pouvez pas savoir si le travail a été divisé en 100 pièces ou 2 pièces; le résultat final ressemble plutôt le résultat d'une seule carte.
Veuillez ressemble à un simple map et reduce programme:
Fonction Map est utilisé pour appliquer une fonction sur notre liste d'origine et une nouvelle liste est donc générée. La carte en fonction de() en Python une fonction et une liste en argument. Une nouvelle liste est renvoyée par l'application de la fonction à chaque élément de la liste.
La réduire() fonction en Python une fonction et une liste en argument. La fonction est appelée avec un lambda de fonction et une liste et une nouvelle réduction de résultat est retourné. Elle effectue une opération répétitive sur les paires de la liste.