2016-07-26 12 views
3

Ich versuche, ein hadoop einzige Einheit Programm für wordcount zu laufen, ich bin dies auf Windows 10 64-Bit zu tun und auf Cygwin, das ist das Programm, das ich bin mit:Klasse nicht Ausnahme in Hadoop gefunden

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); 
    } 
} 

Mein classpath ist wie folgt:

~/hadoop-1.2.1/bin/hadoop jar WordCount.jar hadoop.ProcessUnits input_dir output_dir 

und ich bekomme die folgende Fehlermeldung, wenn ich versuche, das Programm zu kompilieren:

Exception in thread "main" java.lang.ClassNotFoundException: hadoop.ProcessUnits 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

Antwort

1

die Problem ist, dass hadoop.ProcessUnits auf die mainClass zeigen soll, die Sie ausführen möchten. Ihre Klasse ist WordCount genannt, so sollte es etwas wie folgt aussehen:

$ hadoop jar WordCount.jar <PACKAGE>.WordCount input_dir output_dir

Ihr Code den Paketnamen nicht enthalten, so habe ich ersetzt <PACKAGE>

Verwandte Themen