Dans Hadoop, quand les tâches de réduction commencent-elles ? Commencent-elles après un certain pourcentage (seuil) de mappeurs terminés ? Si oui, ce seuil est-il fixe ? Quel type de seuil est généralement utilisé ?
Réponses
Trop de publicités?La phase de réduction comporte trois étapes : le brassage, le tri et la réduction. Le shuffle est l'étape où les données sont collectées par le reducer à partir de chaque mappeur. Cela peut se faire pendant que les mappeurs génèrent des données puisqu'il s'agit seulement d'un transfert de données. En revanche, le tri et la réduction ne peuvent commencer que lorsque tous les mappeurs ont terminé. Vous pouvez savoir ce que MapReduce est en train de faire en regardant le pourcentage d'achèvement du réducteur : 0-33% signifie qu'il fait du shuffle, 34-66% du tri, 67%-100% de la réduction. C'est pourquoi vos réducteurs semblent parfois "bloqués" à 33% - ils attendent que les mappeurs aient terminé.
Les réducteurs commencent le brassage en fonction d'un seuil de pourcentage de mappeurs ayant terminé. Vous pouvez modifier ce paramètre pour que les réducteurs commencent plus tôt ou plus tard.
Pourquoi est-ce que commencer les réducteurs tôt est une bonne chose ? Parce que cela répartit le transfert de données des mappeurs vers les réducteurs dans le temps, ce qui est une bonne chose si votre réseau est un goulot d'étranglement.
Pourquoi est-ce que commencer les réducteurs tôt est une mauvaise chose ? Parce qu'ils "monopolisent" les emplacements de réduction alors qu'ils ne font que copier des données et attendre que les mappeurs aient terminé. Un autre travail qui commence plus tard et qui utilisera les slots de réduction ne pourra pas les utiliser.
Vous pouvez personnaliser le moment où les réducteurs démarrent en changeant la valeur par défaut du paramètre mapred.reduce.slowstart.completed.maps
en mapred-site.xml
. Une valeur de 1.00
attendra que tous les mappeurs aient terminé avant de lancer les réducteurs. Une valeur de 0.0
va démarrer les réducteurs tout de suite. Une valeur de 0.5
lancera les réducteurs lorsque la moitié des mappeurs seront terminés. Vous pouvez également modifier mapred.reduce.slowstart.completed.maps
sur une base individuelle. Dans les nouvelles versions d'Hadoop (au moins 2.4.1), le paramètre est appelé est mapreduce.job.reduce.slowstart.completedmaps
(merci à l'utilisateur yegor256).
En général, j'aime garder mapred.reduce.slowstart.completed.maps
au-dessus de 0.9
si le système a plusieurs travaux en cours en même temps. De cette façon, la tâche n'accapare pas les réducteurs lorsqu'ils ne font rien d'autre que copier des données. Si vous n'avez qu'un seul travail en cours d'exécution à la fois, faire 0.1
serait probablement approprié.
La phase de réduction peut commencer bien avant qu'un réducteur ne soit appelé. Dès qu'un mappeur termine son travail, les données générées sont triées et mélangées (ce qui inclut l'appel au combinateur et au partitionneur). La "phase" du réducteur démarre au moment où le traitement des données post-mappage est lancé. Au fur et à mesure que ce traitement est effectué, vous verrez la progression du pourcentage des réducteurs. Cependant, aucun des réducteurs n'a encore été appelé. En fonction du nombre de processeurs disponibles/utilisés, de la nature des données et du nombre de réducteurs attendus, vous pouvez modifier le paramètre comme décrit par @Donald-miner ci-dessus.
Autant que je comprenne, la phase de réduction commence avec la phase de carte et continue à consommer l'enregistrement des cartes. Cependant, comme il y a une phase de tri et de brassage après la phase map, toutes les sorties doivent être triées et envoyées au réducteur. Donc, logiquement, vous pouvez imaginer que la phase de réduction ne commence qu'après la phase de mappage, mais en fait, pour des raisons de performance, les réducteurs sont également initialisés avec les mappeurs.
Le pourcentage indiqué pour la phase de réduction correspond en fait à la quantité de données copiées de la sortie des cartes vers les répertoires d'entrée des réducteurs. Pour savoir quand commence cette copie ? C'est une configuration que vous pouvez définir comme Donald l'a montré ci-dessus. Une fois que toutes les données sont copiées vers les réducteurs (c'est-à-dire 100% de réduction), c'est à ce moment-là que les réducteurs commencent à travailler et peuvent donc se figer en "100% de réduction" si le code de vos réducteurs est intensif en E/S ou en CPU.
Prenons l'exemple de WordCount afin de mieux comprendre le fonctionnement de la tâche de réduction de carte. Supposons que nous disposions d'un fichier volumineux, par exemple un roman, et que notre tâche consiste à trouver le nombre d'occurrences de chaque mot dans le fichier. Comme le fichier est volumineux, il peut être divisé en différents blocs et répliqué dans différents nœuds de travail. Le travail de comptage de mots est composé de tâches map et reduce. La tâche map prend en entrée chaque bloc et produit une paire clé-valeur intermédiaire. Dans cet exemple, étant donné que nous comptons le nombre d'occurrences de mots, le mappeur, en traitant un bloc, produira des résultats intermédiaires de la forme (mot1, compte1), (mot2, compte2), etc. Les résultats intermédiaires de tous les mappeurs passent par une phase de brassage qui réorganise les résultats intermédiaires.
Supposons que la sortie de notre carte à partir de différents mappeurs est de la forme suivante :
Carte 1:- (is,24) (was,32) (et,12)
Carte2 :- (my,12) (is,23) (was,30)
Les sorties de la carte sont triées de manière à ce que les mêmes valeurs clés soient données au même réducteur. Ici, cela signifierait que les clés correspondant à is, was etc. vont au même réducteur. C'est le réducteur qui produit la sortie finale, qui dans ce cas serait:- (et,12)(est,47)(mon,12)(était,62)