Quel est le but de la phase de mélange et de tri dans le réducteur dans Map Reduce Programming?

113

Dans la programmation de Map Reduce, la phase de réduction comprend le mélange, le tri et la réduction comme sous-parties. Le tri est une affaire coûteuse.

Quel est le but de la phase de mélange et de tri dans le réducteur dans Map Reduce Programming?

Nithin K Anil
la source
3
J'ai toujours supposé que c'était nécessaire car la sortie du mappeur est l'entrée du réducteur, elle a donc été triée en fonction de l'espace de clés, puis divisée en seaux pour chaque entrée du réducteur.
BasicHorizon

Réponses:

171

Tout d'abord, il shufflingy a le processus de transfert de données des mappeurs vers les réducteurs, donc je pense qu'il est évident que c'est nécessaire pour les réducteurs, car sinon, ils ne pourraient pas avoir d'entrée (ou d'entrée de chaque mappeur) . La lecture aléatoire peut commencer avant même la fin de la phase de la carte, pour gagner du temps. C'est pourquoi vous pouvez voir un état de réduction supérieur à 0% (mais inférieur à 33%) lorsque l'état de la carte n'est pas encore à 100%.

Sortingfait gagner du temps au réducteur, en l'aidant à distinguer facilement quand une nouvelle tâche de réduction doit commencer. Il démarre simplement une nouvelle tâche de réduction, lorsque la clé suivante dans les données d'entrée triées est différente de la précédente, pour le dire simplement. Chaque tâche de réduction prend une liste de paires clé-valeur, mais elle doit appeler la méthode reduction () qui prend une entrée de liste de clés (valeur), elle doit donc regrouper les valeurs par clé. C'est facile à faire si les données d'entrée sont pré-triées (localement) dans la phase de carte et simplement triées par fusion dans la phase de réduction (puisque les réducteurs obtiennent les données de nombreux mappeurs).

Partitioning, que vous avez mentionné dans l'une des réponses, est un processus différent. Il détermine dans quel réducteur une paire (clé, valeur), sortie de la phase cartographique, sera envoyée. Le partitionneur par défaut utilise un hachage sur les clés pour les distribuer aux tâches de réduction, mais vous pouvez le remplacer et utiliser votre propre partitionneur personnalisé.

Ce tutoriel Yahoo est une excellente source d'informations pour ces étapes .

Une belle représentation graphique de ceci est la suivante (le shuffle est appelé "copie" dans cette figure):

entrez la description de l'image ici

Notez que shufflinget sortingne sont pas exécutés du tout si vous spécifiez zéro réducteur (setNumReduceTasks (0)). Ensuite, le travail MapReduce s'arrête à la phase de carte, et la phase de carte n'inclut aucun type de tri (donc même la phase de carte est plus rapide).

MISE À JOUR: Puisque vous cherchez quelque chose de plus officiel, vous pouvez également lire le livre de Tom White "Hadoop: The Definitive Guide". Voici la partie intéressante de votre question.
Tom White est un committer Apache Hadoop depuis février 2007 et est membre de l'Apache Software Foundation, donc je suppose que c'est assez crédible et officiel ...

vefthym
la source
"Le tri fait gagner du temps au réducteur, l'aidant à distinguer facilement quand une nouvelle tâche de réduction doit commencer. Il démarre simplement une nouvelle tâche de réduction, lorsque la clé suivante dans les données d'entrée triées est différente de la précédente, pour le dire simplement." Je ne comprends pas cette partie. Mapper utilise un partitionneur pour diviser les déversements en partitions localement, chaque partition étant ensuite envoyée vers une réduction. Comment le tri aide-t-il ici?
MaxNevermind
1
@MaxNevermind Si vous avez x réduire les tâches (partitions), cela ne signifie pas que vous finirez par appeler la méthode reduction () x fois. Il sera appelé une fois pour chaque touche distincte. Ainsi, une tâche de réduction peut appeler la méthode reduction () plusieurs fois.
vefthym
"Il sera appelé une fois pour chaque touche distincte" Pourquoi? Mapper forme des partitions comme il le souhaite (pas nécessaire une partition pour chaque clé distincte), puis chaque partition passe au réducteur, est-ce faux?
MaxNevermind
1
@MaxNevermind Mapper génère des clés et des valeurs, il ne forme pas de partitions. Les partitions sont définies par le nombre de tâches de réduction que l'utilisateur définit et l'implémentation du partitionneur. Les sorties de tous les mappeurs qui ont la même clé vont à la même méthode reduction (). Cela ne peut pas être changé. Mais ce qui peut être changé, c'est quelles autres clés (le cas échéant) seront placées dans la même partition et seront donc gérées par la même tâche. Une tâche de réduction peut appeler la fonction reduction () plus d'une fois, mais une seule fois pour chaque touche.
vefthym
2
ok je pense que je l'ai. Mon problème était que j'avais oublié que la réduction prend une liste de valeurs comme argument et pas seulement une paire clé-valeur. Je pense que vous devriez développer ceci dans votre réponse: "Chaque tâche de réduction prend une liste de paires clé-valeur mais elle doit appeler la méthode de réduction qui prend une liste-clé <valeur>, donc elle doit regrouper les valeurs par clé, c'est facile à faire si les données d'entrée sont pré-triées dans une étape de
mappage
42

Revenons sur les phases clés du programme Mapreduce.

La phase de carte est effectuée par les mappeurs. Les mappeurs s'exécutent sur des paires clé / valeur d'entrée non triées. Chaque mappeur émet zéro, une ou plusieurs paires clé / valeur de sortie pour chaque paire clé / valeur d'entrée.

La phase de combinaison est effectuée par des combineurs. Le combineur doit combiner des paires clé / valeur avec la même clé. Chaque combineur peut s'exécuter zéro, une ou plusieurs fois.

La phase de mélange et de tri est effectuée par le framework. Les données de tous les mappeurs sont regroupées par clé, réparties entre les réducteurs et triées par clé. Chaque réducteur obtient toutes les valeurs associées à la même clé. Le programmeur peut fournir des fonctions de comparaison personnalisées pour le tri et un partitionneur pour la division des données.

Le partitionneur décide quel réducteur obtiendra une paire clé / valeur particulière.

Le réducteur obtient des paires clé / [liste de valeurs] triées, triées par clé. La liste de valeurs contient toutes les valeurs avec la même clé produite par les mappeurs. Chaque réducteur émet zéro, une ou plusieurs paires clé / valeur de sortie pour chaque paire clé / valeur d'entrée .

Jetez un œil à cet article javacodegeeks de Maria Jurcovicova et à l' article mssqltips de Datta pour une meilleure compréhension

Ci-dessous l'image de l' article safaribooksonline

entrez la description de l'image ici

Ravindra babu
la source
Je pense qu'il y a une faute de frappe dans l'image (dont je me rends compte qu'elle vient d'être copiée ici). Je crois que les iechaînes sous Reducers et Output devraient l'être is.
Jeff Evans
32

J'ai pensé à simplement ajouter quelques points manquants dans les réponses ci-dessus. Ce diagramme pris à partir d' ici indique clairement ce qui se passe réellement.

entrez la description de l'image ici

Si je répète le véritable but de

  • Split: améliore le traitement parallèle en répartissant la charge de traitement sur différents nœuds (Mappers), ce qui permettrait de gagner du temps de traitement global.

  • Combiner: réduit la sortie de chaque mappeur. Cela permettrait de gagner du temps pour déplacer les données d'un nœud à un autre.

  • Trier (Shuffle & Sort): permet à l'exécution de planifier facilement (générer / démarrer) de nouveaux réducteurs, où tout en parcourant la liste des éléments triés, chaque fois que la clé actuelle est différente de la précédente, elle peut générer un nouveau réducteur. .

Supun Wijerathne
la source
D'où viendrait l'étape de partition dans ce graphique? Après la carte et avant de combiner?
Joel le
@Joel J'espère que vous vous référez à l'étape «split»?
Supun Wijerathne le
Non, je veux dire l'étape de partition, il décide à quel réducteur envoyer les données, en utilisant un simple modulo de hachage par défaut, après quelques recherches supplémentaires, je pense que cela vient après l'étape de combinaison, avant de mélanger et de trier.
Joel le
1
@Joel Je ne suis pas assez clair sur ce que vous avez l'intention de décrire. En un mot, la séquence exacte des étapes peut être assez spécifique au problème. Je peux dire que pour certains scénarios, même le tri n'est pas nécessaire. Pour en revenir à votre entrée, si je parle spécifiquement de l'exemple de comptage de mots simple ci-dessus, je ne vois pas vraiment la nécessité d'un tel partitionnement pour décider des réducteurs. Ici, il est assez simple de générer des réductions par clé. Mais je peux deviner que votre argument peut être valable pour certains scénarios. Franchement, je n'ai pas d'idée précise à ce sujet.
Supun Wijerathne le
4

Certaines des exigences en matière de traitement des données ne nécessitent aucun tri. Syncsort avait rendu le tri dans Hadoop enfichable. Voici un joli blog de leur part sur le tri. Le processus de déplacement des données des mappeurs vers les réducteurs s'appelle la lecture aléatoire, consultez cet article pour plus d'informations à ce sujet.

Praveen Sripati
la source
2

J'ai toujours supposé que c'était nécessaire car la sortie du mappeur est l'entrée du réducteur, elle a donc été triée en fonction de l'espace de clés, puis divisée en seaux pour chaque entrée du réducteur. Vous voulez vous assurer que toutes les mêmes valeurs d'une clé se retrouvent dans le même compartiment en direction du réducteur afin qu'elles soient réduites ensemble. Il est inutile d'envoyer K1, V2 et K1, V4 à différents réducteurs car ils doivent être ensemble pour être réduits.

J'ai essayé de l'expliquer aussi simplement que possible

BasicHorizon
la source
Si nous voulons envoyer k1, v1 et k1, v4 au même réducteur, nous pouvons faire un mélange. alors quel est le but du tri?
Nithin K Anil
Il effectue le tri pour plusieurs raisons, l'une des raisons est que, lorsqu'un Job MapReduce envoie toutes les paires KV à un réducteur si l'entrée n'est pas triée, il faudrait analyser toutes les sorties du Mapper pour récupérer chaque instance de K1, VX . alors que si la sortie du mappeur est triée dès que K2, VX est récupéré, vous savez que tout K1, VX a été récupéré et que cet ensemble peut être envoyé à un réducteur pour traitement, l'avantage est que vous ne le faites pas il faut attendre que chaque réducteur soit prêt pour que chacun d'entre eux commence à réduire.
BasicHorizon
De plus, en ce qui concerne l'agrégation, si vous spécifiez que vous souhaitez agréger tout K1, V1 si l'entrée du réducteur est triée dès que le réducteur prend K2, V2, il sait qu'il n'y a plus d'instances de K1, V1, donc il peut terminer son agrégation alors que si l'entrée du réducteur n'est pas triée, il devra analyser toute l'entrée pour K1, V1
BasicHorizon
2

Le brassage est le processus par lequel les données intermédiaires des mappeurs sont transférées vers 0,1 ou plus de réducteurs. Chaque réducteur reçoit 1 ou plusieurs clés et ses valeurs associées en fonction du nombre de réducteurs (pour une charge équilibrée). De plus, les valeurs associées à chaque clé sont triées localement.

Shailvi
la source
0

MapReduce ne fait que deux choses NATIVELY: Trier et (implémenté par tri) évolutif GroupBy.

La plupart des applications et des modèles de conception sur MapReduce sont construits sur ces deux opérations, qui sont fournies par shuffle et sort.

Evgeny Benediktov
la source
0

C'est une bonne lecture. J'espère que ça aide. En termes de tri, vous vous préoccupez, je pense que c'est pour l'opération de fusion à la dernière étape de Map. Lorsque l'opération de mappage est terminée et que vous devez écrire le résultat sur le disque local, une multi-fusion sera effectuée sur les fractionnements générés à partir du tampon. Et pour une opération de fusion, le tri de chaque partition à l'avance est utile.

hakunami
la source
0

Eh bien, dans Mapreduce, il y a deux phrases importantes appelées Mapper et réducteur sont tous deux trop importants, mais Reducer est obligatoire. Dans certains programmes, les réducteurs sont facultatifs. Maintenant, venez à votre question. Le brassage et le tri sont deux opérations importantes chez Mapreduce. Le premier framework Hadoop prend des données structurées / non structurées et sépare les données en clé, valeur.

Maintenant, le programme Mapper sépare et organise les données en clés et valeurs à traiter. Générez des valeurs de clé 2 et de valeur 2. Ces valeurs doivent être traitées et réorganisées dans le bon ordre pour obtenir la solution souhaitée. Maintenant, ce mélange et ce tri sont effectués dans votre système local (Framework s'en occupe) et processus dans le système local après le nettoyage du framework de processus des données dans le système local. D'accord

Ici, nous utilisons également un combineur et une partition pour optimiser ce processus de mélange et de tri. Après une disposition appropriée, ces valeurs de clé sont transmises au réducteur pour obtenir la sortie souhaitée du client. Enfin, le réducteur obtient la sortie souhaitée.

K1, V1 -> K2, V2 (nous allons écrire le programme Mapper), -> K2, V '(ici mélanger et adoucir les données) -> K3, V3 Générer la sortie. K4, V4.

Veuillez noter que toutes ces étapes ne sont que des opérations logiques et ne modifient pas les données d'origine.

Votre question: Quel est le but de la phase de mélange et de tri dans le réducteur dans Map Reduce Programming?

Réponse courte: Pour traiter les données pour obtenir la sortie souhaitée. La lecture aléatoire consiste à agréger les données, à réduire la sortie attendue.

Venu A positif
la source