2017-10-08 3 views
0

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.

+1

Lorsque vous avez créé le fichier JAR, pensait-il que le dossier sharedFiles était un package? Avez-vous essayé 'sharedFiles.WordCount'? –

+0

@ 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

Répondre

0

@Yash, pourriez-vous s'il vous plaît vérifier votre commande. Je pense que vous avez écrit le nom de la classe dans une petite lettre de cas, tout en exécutant la commande Hadoop jar.

hadoop jar /sharedFiles/wc.jar WordCount /sharedFiles/history /sharedFiles /output 

J'espère que cela va vous aider.

+0

Je l'ai changé et toujours obtenir l'erreur. hadoop jar /sharedFiles/wc.jar WordCount/sharedFiles/history/sharedFiles/output Exception dans le thread "principal" java.lang.ClassNotFoundException: WordCount – Yash

+0

Vous pouvez également vérifier la commande tar -tf WC.jar. Il montrera si les classes requises sont générées correctement ou non. –