Ma version Hadoop est: 2.8.1la carte Réduire programme de nombre de mots donne « classe non trouvée exception »
Je suis en train d'exécuter l'exemple MapReduce qui est en Apache Hadoop 2.8.0
code source WordCount est aussi ci-dessous. (le même que dans l'exemple donné Hadoop 2.8.0)
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.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;
public class WordCount {
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;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(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(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
I créé un fichier de WordCount.java en insérant le code ci-dessus. Ensuite, je l'ai compilé.
javac -cp $HADOOP_CLASSPATH /sharedFiles/WordCount.java
Puis j'ai combiné WordCount * .classes pour créer un fichier wc.jar.
jar cf /sharedFiles/wc.jar /sharedFiles/WordCount*.class
À l'intérieur du dossier sharedFiles, les fichiers se présentent comme ci-dessous.
ls /sharedFiles
history wc.jar WordCount.class
WordCount$IntSumReducer.class
WordCount.java WordCount$TokenizerMapper.class
Puis j'ai essayé d'exécuter la commande mapreduce.
hadoop jar /sharedFiles/wc.jar wordcount /sharedFiles/history /sharedFiles /output
Il me jette cette erreur. J'ai remarqué que la classe de pilotes "wordcount" n'est pas créée dans le dossier respectif. Y a-t-il quelque chose que je puisse faire pour créer cette classe? Dans le tutoriel, ils n'ont mentionné aucune étape supplémentaire pour créer ce fichier.
Merci.
Lorsque vous avez créé le fichier JAR, pensait-il que le dossier sharedFiles était un package? Avez-vous essayé 'sharedFiles.WordCount'? –
@ cricket_007 Oui, cela a fonctionné. Parallèlement à cela, le nom du paquet devait également être ajouté au fichier WordCount, java. Je ne comprends pas pourquoi cela est nécessaire, car dans la ligne de commande, nous spécifions le chemin complet de WordCount.java. Cependant, il a fait l'affaire pour moi. Je vous remercie! – Yash