40 votes

Définition du nombre de tâches de cartographie et de réduction

J'effectue actuellement un travail pour lequel j'ai fixé le nombre de tâches à 20 mais j'obtiens un nombre plus élevé. J'ai également fixé la tâche de réduction à zéro mais j'obtiens toujours un nombre différent de zéro. La durée totale de la tâche MapReduce ne s'affiche pas non plus. Quelqu'un peut-il me dire ce que je fais de travers ? J'utilise la commande suivante

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

Salida:

11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient:   Job Counters 
11/07/30 19:48:56 INFO mapred.JobClient:     Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient:     Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:     Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient:     Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:   FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_READ=1556534680
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=6026699058
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:   Map-Reduce Framework
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input groups=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Combine output records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map input records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce shuffle bytes=1974162269
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Spilled Records=120000000
11/07/30 19:48:56 INFO mapred.JobClient:     Map output bytes=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:     Combine input records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input records=40000000
[hcrc1425n30]s0907855:

62voto

Praveen Sripati Points 11365

Le nombre de tâches de cartographie pour un travail donné est déterminé par le nombre de divisions d'entrée et non par le paramètre mapred.map.tasks. Pour chaque fractionnement d'entrée, une tâche de cartographie est créée. Ainsi, au cours de la durée de vie d'un travail mapreduce, le nombre de tâches map est égal au nombre de divisions d'entrée. mapred.map.tasks n'est qu'une indication du format d'entrée pour le nombre de maps.

Dans votre exemple, Hadoop a déterminé qu'il y avait 24 divisions d'entrée et créera 24 tâches de cartographie au total. Mais vous pouvez contrôler le nombre de tâches qui peuvent être exécutées en parallèle par chacun des traqueurs de tâches.

De même, la suppression d'un espace après -D pourrait résoudre le problème de la réduction.

Pour plus d'informations sur le nombre de tâches "map" et "reduce", veuillez consulter l'url suivante

https://cwiki.apache.org/confluence/display/HADOOP2/HowManyMapsAndReduces

21voto

Matt Tenenbaum Points 1136

Comme Praveen le mentionne plus haut, lorsque l'on utilise la fonction de base FileInputFormat est simplement le nombre de fractionnements d'entrée qui constituent les données. Le nombre de réducteurs es contrôlé par mapred.reduce.tasks spécifiée dans la manière dont vous la présentez : -D mapred.reduce.tasks=10 spécifierait 10 réducteurs. Notez que l'espace après -D es nécessaires ; si vous omettez l'espace, la propriété de configuration est transmise à la JVM concernée, et non à Hadoop.

Précisez-vous 0 parce qu'il n'y a pas de travail de réduction à faire ? Dans ce cas, si vous avez des difficultés avec le paramètre d'exécution, vous pouvez également définir la valeur directement dans le code. Étant donné un JobConf instance job , appeler

job.setNumReduceTasks(0);

à l'intérieur, par exemple, de votre implémentation de Tool.run . Cela devrait produire un résultat directement à partir des mappeurs. Si votre travail ne produit aucun résultat (parce que vous utilisez le framework uniquement pour des effets secondaires comme les appels réseau ou le traitement d'images, ou si les résultats sont entièrement pris en compte dans les valeurs de Counter), vous pouvez désactiver la sortie en appelant également

job.setOutputFormat(NullOutputFormat.class);

9voto

Engineiro Points 1156

Il est important de garder à l'esprit que le cadre MapReduce de Hadoop nous permet seulement de

suggérer le nombre de tâches Map pour un travail

qui, comme Praveen l'a souligné plus haut, correspondra au nombre d'entrées divisées pour la tâche. Contrairement à son comportement pour le nombre de réducteurs (qui est directement lié au nombre de fichiers produits par la tâche MapReduce) où nous pouvons

demande qu'il fournisse n réducteurs.

8voto

praveenak Points 83

Pour l'expliquer à l'aide d'un exemple :

Supposons que la taille de votre fichier d'entrée Hadoop soit de 2 Go et que vous ayez défini une taille de bloc de 64 Mo. 32 tâches de mappage sont donc définies pour être exécutées, chaque mappeur devant traiter un bloc de 64 Mo pour terminer la tâche de mappage de votre tâche Hadoop.

\==> Le nombre de mappeurs à exécuter dépend entièrement de 1) la taille du fichier et de 2) la taille du bloc.

Supposons que vous exécutiez Hadoop sur un cluster de taille 4 : Supposons que vous ayez défini les paramètres mapred.map.tasks et mapred.reduce.tasks dans votre fichier conf pour les nœuds comme suit :

Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2
Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1

Supposons que vous ayez défini les paramètres ci-dessus pour 4 de vos nœuds dans ce cluster. Si vous remarquez que le nœud 2 n'a défini que 2 et 2 respectivement, c'est parce que les ressources de traitement du nœud 2 peuvent être moindres, par exemple (2 processeurs, 2 cœurs) et que le nœud 4 est encore plus bas, avec seulement 1 et 1 respectivement, ce qui peut être dû au fait que les ressources de traitement sur ce nœud sont 1 processeur, 2 cœurs et qu'il ne peut donc pas exécuter plus d'une tâche de mappeur et d'une tâche de réducteur.

Ainsi, lorsque vous exécutez le travail, les nœuds 1, 2, 3 et 4 sont configurés pour exécuter simultanément un total maximum de (4+2+4+1)11 tâches de mappeur sur les 42 tâches de mappeur qui doivent être exécutées par le travail. Une fois que chaque nœud a terminé ses tâches de mappage, il prend les tâches de mappage restantes sur les 42 tâches de mappage.

En ce qui concerne les réducteurs, comme vous avez défini mapred.reduce.tasks = 0, nous n'obtenons que les résultats du mappeur dans 42 fichiers (1 fichier pour chaque tâche du mappeur) et aucun résultat du réducteur.

4voto

Joel Points 103

Dans la version la plus récente de Hadoop, il y a beaucoup plus de granularités. mapreduce.job.running.map.limit y mapreduce.job.running.reduce.limit qui vous permet de définir le nombre de mappeurs et de réducteurs sans tenir compte de la taille de division des fichiers hdfs. Ceci est utile si vous êtes contraint de ne pas utiliser de grandes ressources dans le cluster.

JIRA

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