208 votes

Bonne carte / Réduire les exemples pour l'explication

quelques jours avant, j'ai eu à expliquer Map/reduce pour l'un de mes collègues et bien sûr, je ne pouvais pas penser tout bon des exemples plutôt que le "comment compter le nombre de mots dans un texte long avec map/reduce" -tâche. J'ai réussi à lui donner une idée de Map/reduce. Mais j'ai aussi trouvé que ce n'était pas le meilleur exemple à donner de lui une impression de la puissance de cet outil peut être. Donc, ma question - quels sont les meilleurs exemples de réflexion sur Map/reduce?

Juste pour être clair, je ne suis pas à la recherche de code-extraits, vraiment juste "textuelle" des exemples qui pourraient aider à comprendre elle même .

Cheers

307voto

karthikr Points 36157

Je pense que Trouver des Amis via la carte de réduire peut être un puissant exemple pour comprendre le concept, et un bien utilisé de cas d'utilisation.

Personnellement, trouvé ce lien très utile.

http://stevekrenzel.com/finding-friends-with-mapreduce

EDIT:

Aussi, wikipédia a un article intéressant expliquant ce qu' map-reduce est

La copie de l'explication fournie dans le blog (Dans le cas où le lien est périmé)

Trouver Des Amis

MapReduce est un framework développé à l'origine par Google qui permet de faire facilement à grande échelle de calcul distribué à travers un certain nombre de domaines. Apache Hadoop est une implémentation open source.

Je vais brillant sur les détails, mais il revient à la définition de deux fonctions: une fonction de mappage et d'une fonction de réduction. La fonction map prend une valeur et sorties de la clé:des paires de valeurs. Par exemple, si nous définissons une carte de fonction qui prend une chaîne et sorties de la longueur de la parole comme la clé et le mot lui-même que la valeur de la carte(steve) serait de retour 5:steve et carte de savannah) serait de retour 8:savannah. Vous avez peut-être remarqué que la fonction map est apatride et ne requiert que la valeur d'entrée pour calculer la valeur de sortie. Cela nous permet d'exécuter la fonction map contre des valeurs en parallèle et offre un énorme avantage. Avant d'arriver à la fonction de réduction, le mapreduce cadre des groupes de toutes les valeurs par clé, donc si des fonctions de la carte de sortie de la clé suivante:valeur de paires:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

Ils obtiennent regroupées comme:

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

Chacune de ces lignes serait alors passé comme argument à la fonction de réduction, qui accepte une clé et d'une liste de valeurs. Dans ce cas, nous avons peut-être essayer de comprendre comment beaucoup de paroles de certaines longueurs existent, de sorte que notre fonction de réduction sera juste de compter le nombre d'éléments dans la liste et de sortie de la clé avec la taille de la liste, comme:

3 : 3
4 : 3
5 : 2
8 : 2

Les réductions peuvent également être réalisés en parallèle, et encore fournir un énorme avantage. On peut alors observer ces résultats définitifs et de voir qu'il n'y avait que deux mots de longueur 5 dans notre corpus, etc...

L'exemple le plus commun de mapreduce est pour compter le nombre de fois où les mots se produire dans un corpus. Supposons que vous ayez une copie de l'internet (j'ai eu la chance de travailler dans une telle situation), et que vous voulez une liste de tous les mots sur l'internet ainsi que combien de fois elle s'est produite.

La façon dont vous le feriez pour cela serait de marquer les documents que vous avez (pause en mots), et de passer chaque mot à un mappeur. Le mappeur serait alors cracher le mot de retour avec une valeur de 1. Le regroupement de la phase prendra toutes les touches (dans ce cas les mots), et de faire une liste de 1. L'réduire la phase prend alors une clé (mot) et une liste (une liste de 1 à chaque fois que la touche est apparu sur l'internet), ainsi que des sommes à la liste. Le réducteur ensuite les sorties de la parole, ainsi que le comte. Quand tout est dit et fait, vous aurez une liste de tous les mots sur l'internet, ainsi que le nombre de fois qu'elle est apparue.

Facile, droit? Si vous avez jamais lu sur mapreduce, le scénario ci-dessus n'est pas quelque chose de nouveau... c'est le "Hello, World" de mapreduce. Voici donc un monde réel de cas d'utilisation (Facebook peut faire ou ne pas faire, c'est juste un exemple):

Facebook a une liste d'amis (notez que les amis sont un bi-directionnelle chose sur Facebook. Si je suis votre ami, vous êtes mine). Ils ont aussi beaucoup d'espace disque et ils servent des centaines de millions de requêtes quotidiennes. Ils ont décidé de pré-calculer les calculs quand ils le peuvent afin de réduire le temps de traitement des demandes. Une commune d'une demande de traitement est le "Vous et Joe ont 230 amis en commun". Lorsque vous consultez le profil d'un participant, vous pouvez voir une liste d'amis que vous avez en commun. Cette liste ne change pas souvent de sorte qu'il serait fastidieux de les recalculer à chaque fois que vous avez visité le profil (bien sûr, vous pourriez utiliser un décent stratégie de mise en cache, mais alors je ne serais pas en mesure de continuer à écrire sur mapreduce pour ce problème). Nous allons utiliser mapreduce afin que nous puissions calculer tous les amis en commun une fois par jour, et de stocker ces résultats. Plus tard, c'est juste une recherche rapide. Nous avons beaucoup d'espace disque, c'est pas cher.

Assumer les amis sont stockés en tant que Personne->[Liste d'Amis], notre liste d'amis est alors:

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

Chaque ligne sera un argument pour un mappeur. Pour chaque ami dans la liste d'amis, le mappeur va sortir une paire clé-valeur. La clé sera d'un ami avec la personne. La valeur de la liste d'amis. Les clés seront triés afin que les amis sont dans l'ordre, à l'origine de toutes les paires d'amis pour aller à la même réducteur. C'est difficile à expliquer avec le texte, il faut juste laisser faire et voir si vous pouvez voir le modèle. Après tout, les cartographes sont faites en cours d'exécution, vous aurez une liste comme ceci:

For map(A -> B C D) :

(A B) -> B C D
(A C) -> B C D
(A D) -> B C D

For map(B -> A C D E) : (Note that A comes before B in the key)

(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :

(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :

(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):

(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:

(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

Chaque ligne sera passé comme argument à un réducteur. La fonction de réduction sera tout simplement se croisent les listes de valeurs et de sortie de la même clé avec le résultat de l'intersection. Par exemple, réduire((A B) -> (C D E) (B C D)) sortie (B) : (C D) et signifie que les amis de A et de B, C et D comme des amis communs.

Le résultat après réduction est:

(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)

Maintenant, lors D visite B du profil, nous pouvons trouver rapidement (B D) et de voir qu'ils ont trois amis en commun, (A C E).

27voto

Nikita Ivanov Points 171

L'un des meilleurs exemples d'implémentation MapReduce de type Hadoop est disponible ici: http://highlyscalable.wordpress.com/2012/02/01/mapreduce-patterns/

Gardez cependant à l'esprit qu'ils sont limités à l'implémentation de l'idée MapReduce basée sur key-value (ils limitent donc leur applicabilité).

4voto

guyrt Points 647

Un ensemble d'opérations courantes que vous pouvez effectuer dans MapReduce est l'ensemble des opérations SQL normales: SELECT, SELECT WHERE, GROUP BY, etc.

Un autre bon exemple est la multiplication par matrice, où vous passez une ligne de M et le vecteur entier x et calculez un élément de M * x.

3voto

David Gruzman Points 5129

De temps à autre, je vous présente M. des concepts aux gens. J'essaie de trouver le traitement des tâches familières aux gens et de les mapper à M. de paradigme.
D'habitude, je prends deux choses: a) Group By / Agrégations. Il est facile de comprendre et d'ici l'avantage de la phase de brassage est clair.
b) la Jointure de deux tables. Les personnes qui travaillent avec DB familiers avec le concept et son problème d'évolutivité. Afin de montrer comment il peut être fait dans M. - donne de bonnes explications.
c) l'Explication du fait que le brassage est également distribué tri + explication de distribués algorithme de tri permet également de

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X