2014-07-19 2 views
5

Je sais que le nombre de mappeur peut être défini en fonction de ma taille de division dfs en définissant mapred.min.split.size sur dfs.block.size.Comment définir dynamiquement le nombre de réducteurs en fonction de ma taille de sortie de mappeur?

Similaire comment peut-on définir I le nombre de réducteurs en fonction de ma taille de sortie de mappeur? PS: Je sais que les options ci-dessous peuvent être utilisées pour manipuler le nombre de réducteur. mapred.tasktracker.reduce.tasks.maximum mapred.reduce.tasks

Répondre

0

Si vous souhaitez définir le nombre de cartographes et réducteurs par la ligne de commande dynamique :: vous pouvez utiliser les options ci-dessous:

-D mapred.map.tasks = 5 -D mapred.reduce.tasks = 5

Nous pouvons également définir le nombre de cartographes et dans le code réducteurs du pilote: job.setNumMapTasks(); job.setNumReduceTasks();

Je ne pense pas que vous pouvez changer dynamiquement le nombre de réducteurs une fois que la carte a réduit le travail. Pour autant que je sache, il n'y aurait pas d'interaction humaine de fournir des valeurs pendant le travail. Le travail de réduction de carte est un processus de traitement par lots (dure longtemps), ainsi il est difficile pour l'utilisateur de savoir quand il demandera à l'utilisateur le nombre de réducteurs et il n'est pas conçu pour être interactif pendant ce processus! J'espère que vous avez la réponse !!

+0

@Merla: Merci pour la réponse. Mais toujours les suggestions ne fournissent pas une option pour les changer dynamiquement pendant le travail en cas de différence de volume lors du traitement des données. – Makubex

+0

Je ne pense pas que vous pouvez changer dynamiquement le nombre de réducteurs une fois que la carte a réduit le travail commencé. Autant que je sache, il n'y aurait aucune interaction humaine de fournir des valeurs pendant le travail est en cours d'exécution.Il devrait être préconfiguré. Le travail de réduction de carte est un processus de traitement par lots (dure longtemps), ainsi il est difficile pour l'utilisateur de savoir quand il demandera à l'utilisateur le nombre de réducteurs et il n'est pas conçu pour être interactif pendant ce processus! J'espère que vous avez la réponse !! –

0

Pour définir nombre de tâches de réducteur dynamique:

Le nombre de cartes est généralement entraîné par le nombre de blocs DFS dans les fichiers d'entrée. Bien que cela amène les gens à ajuster leur taille de bloc DFS pour ajuster le nombre de cartes. Par conséquent, dans le code ci-dessous, définissons le nombre de tâches du réducteur de façon dynamique pour ajuster le nombre de tâches de mappage lors de l'exécution.

Dans le code Java:

long defaultBlockSize = 0; 
int NumOfReduce = 10; // you can set anything 
long inputFileLength = 0; 
try { 
    FileSystem fileSystem = FileSystem.get(this.getConf()); // hdfs file 
                  // system 
    inputFileLength = fileSystem.getContentSummary(
      new Path(PROP_HDFS_INPUT_LOCATION)).getLength();// input 
                  // file or 
                  // files 
                  // stored in 
                  // hdfs 

    defaultBlockSize = fileSystem.getDefaultBlockSize(new Path(
      hdfsFilePath.concat("PROP_HDFS_INPUT_LOCATION")));// getting 
                   // default 
                   // block 
                   // size 
    if (inputFileLength > 0 && defaultBlockSize > 0) { 
     NumOfReduce = (int) (((inputFileLength/defaultBlockSize) + 1) * 2);// calculating 
                       // no. 
                       // of 
                       // blocks 
    } 
    System.out.println("NumOfReduce : " + NumOfReduce); 
} catch (Exception e) { 
    LOGGER.error(" Exception{} ", e); 
} 

job.setNumReduceTasks(NumOfReduce); 
+0

ce n'est pas une réponse à la question – dpolaczanski

2

Aucun des réducteurs ne peut pas définir après la présentation du travail. Pensez-y de cette façon - partitioner est appelé sur la sortie du mappeur et il doit connaître le nombre de réducteurs à partitionner.

Questions connexes