L'exécution de deux mappeur et deux réducteur pour de simples hadoop mapreduce
Je voulais juste avoir une meilleure compréhension sur l'utilisation de plusieurs cartographes et les réducteurs.Je veux essayer ceci à l'aide d'une simple hadoop mapreduce nombre de mots de l'emploi.Je veux courir deux mappeur et deux réducteur pour cette tâche wordcount.Est là que j'ai besoin de configurer manuellement les fichiers de configuration ou est-il juste assez pour juste faire des changements sur le WordCount.java fichier.
Je suis l'exécution de ce travail sur un Seul nœud.Et je suis d'exécuter cette tâche que
$ hadoop jar job.jar d'entrée et de sortie
Et j'ai commencé à
$ hadoop namenode -format
$ hadoop namenode
$ hadoop datanode
sbin$ ./yarn-daemon.sh début resourcemanager
sbin$ ./yarn-daemon.sh début resourcemanager
Je suis à court d'hadoop-2.0.0-cdh4.0.0
Et mon WordCount.java fichier est
package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.rg.apache.hadoop.fs.Path;
import oapache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
private static final Log LOG = LogFactory.getLog(WordCount.class);
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
//printKeyAndValues(key, values);
for (IntWritable val : values) {
sum += val.get();
LOG.info("val = " + val.get());
}
LOG.info("sum = " + sum + " key = " + key);
result.set(sum);
context.write(key, result);
//System.err.println(String.format("[reduce] word: (%s), count: (%d)", key, result.get()));
}
//a little method to print debug output
private void printKeyAndValues(Text key, Iterable<IntWritable> values)
{
StringBuilder sb = new StringBuilder();
for (IntWritable val : values)
{
sb.append(val.get() + ", ");
}
System.err.println(String.format("[reduce] key: (%s), value: (%s)", key, sb.toString()));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Pourrait quiconque d'entre vous m'aider maintenant pour exécuter deux mappeur et les réducteurs pour ce nombre de mots de l'emploi?
OriginalL'auteur | 2012-07-30
Vous devez vous connecter pour publier un commentaire.
Gladnick: Dans le cas où vous prévoyez d'utiliser la valeur par défaut TextInputFormat, il y aurait au moins autant de mappeurs le nombre de fichiers d'entrée (ou plus selon la taille du fichier). Donc, juste mettre les 2 fichiers dans votre entrée répertoires de sorte que vous pouvez obtenir 2 mappeurs en cours d'exécution. (Conseiller cette solution, parce que vous envisagez d'exécuter ce qu'un cas de test).
Maintenant que vous avez demandé pour 2 réducteurs, tout ce que vous devez faire est de travail.setNumReduceTasks(2) dans votre main avant de l'envoi du travail.
Après que vient de préparer un pot de votre application et de lancer que dans hadoop pseudo cluster.
Dans le cas où vous avez besoin de spécifier le mot de aller qui réducteur, vous pouvez le spécifier dans le programme de Partitionnement de classe.
Ce doit être la structure de votre programme principal. Vous pouvez inclure le viseur et l'outil de partitionnement en cas de besoin.
Et le travail a couru, mais je ne pourrais pas trouver une différence dans la sortie!!
Je ne pourrais pas comprendre comment utiliser hadoop pseudo cluster.Vouliez-vous dire de l'utiliser comme $ hadoop pseudo cluster jar job.jar <input> <produit> si oui, je reçois le message d'erreur: Pas de pseudo-classe a trouvé
Ce que je voulais dire par des pseudo mode est normal Installation de hadoop mimicing le mode de Cluster. Oui comme vous l'avez dit, juste courir le pot dans le terminal en tant que hadoop pot <mainclassname> <inputdir> <outputdir>
OriginalL'auteur Arun A K
Pour les contributeurs ensemble
à la moitié de la taille de votre fichier.
Pour les réducteurs à jeu à 2, explicitement, comme
Comment puis-je savoir si il y avait deux mappeurs de la course!!
oui, c'est correct.
Vérifier les compteurs à zéro à la fin. Cela devrait vous dire le nombre de cartes et de réducteurs.
Fakrudeen: je suppose que vous avez dit que les propriétés en ce qui concerne les vieux Hadoop API. Pourriez vous s'il vous plaît garder à jour?
OriginalL'auteur Fakrudeen