2016-12-09 164 views
1

我工作的Hadoop的簡單的程序,我跟着這個教程的步驟: http://www.bogotobogo.com/Hadoop/BigData_hadoop_Creating_Java_Wordcount_Project_with_Eclipse_MapReduce2.php的Hadoop類未發現異常

即使我試圖在兩臺不同的機器,它一直顯示此異常:

Exception in thread "main" java.lang.ClassNotFoundException: test.java 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:270) 
at org.apache.hadoop.util.RunJar.run(RunJar.java:214) 
at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 

package pa2; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 


public class test extends Configured implements Tool{ 


public int run(String[] args) throws Exception 
{ if (args.length<2) 
{ 
    System.out.println("plz give proper arguments"); 
    return -1; 
} 
     //creating a JobConf object and assigning a job name for identification purposes 
     JobConf conf = new JobConf(test.class); 

     FileInputFormat.setInputPaths(conf, new Path(args[0])); 
     FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

     conf.setMapperClass(mapper.class); 

     conf.setMapOutputKeyClass(Text.class); 
     conf.setMapOutputValueClass(IntWritable.class); 

     conf.setOutputKeyClass(Text.class); 
     conf.setOutputValueClass(IntWritable.class); 

     JobClient.runJob(conf); 

     return 0; 
} 


public static void main(String[] args) throws Exception 
{ 
     // this main function will call run method defined above. 
    int exitcode = ToolRunner.run(new test(),args); 
     System.exit(exitcode); 
} 
} 

可以請你告訴我這裏有什麼問題?

更新:

映射類:

package pa2; 
import java.io.IOException; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reporter; 


public class mapper extends MapReduceBase 
     implements Mapper<LongWritable,Text, Text, IntWritable> 
{ 
      public void map(LongWritable Key, Text value, 
      OutputCollector<Text, IntWritable> output, Reporter r) 
      throws IOException { 


      int i=0; 
      String [] array = new String [50]; 


         String name; 
         String year; 
         String s=value.toString(); 

         for (String word:s.split(",")){ 

        word = s.substring(0, s.indexOf(",")+1); 
        year= word.substring(0, s.indexOf(",")+1); 
        name=word.substring(s.indexOf(",")+1); 
        int theyear= Integer.parseInt(year); 


        if(theyear<2000){ 
         array[i] =name; 
         output.collect(new Text(word), new IntWritable(1)); 

         i++;} 

        }  
    } 
} 

我沒有寫減速類。我將項目導出爲jar文件,並且我創建了一個名爲movies的文本文件作爲程序的輸入。然後在終端中寫道的:

[[email protected] ~]$ cd workspace 
[[email protected] workspace]$ ls 
pa2 pa2.jar training 
[[email protected] workspace]$ hadoop jar pa2.jar test movies.txt output.txt 
Exception in thread "main" java.lang.ClassNotFoundException: test 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:270) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:214) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
+0

你是如何創建這個JAR文件的? –

+0

export> jar file>我將它命名爲pa2.jar(與項目名稱>完成相同 – hailah

+0

試着按照教程中的描述逐句執行'test'和'mapper'應該1)大寫爲Java類,那麼類是'默認包中的'WordCount'。 –

回答

0

沒有保證,這是解決眼前的問題,但

package pa2; 

這是附加到的類名。換句話說,完全合格的類名是pa2.test

所以,儘量

hadoop jar ~/workspace/pa2.jar pa2.test input output 

如果您使用的是默認包這樣的教程顯示,你就不需要在命令行上指定包。

+0

我試過這個,它說:不是一個有效的JAR:/home/cloudera/pa2.jar – hailah

+0

那麼,它不是在那個文件夾/那個JAR無效,就像它說的那樣。 –

+0

對不起,我錯了,它現在終於工作了!非常感謝你。 – hailah

0

應該在這裏提供

conf.setMapperClass(mapper.class); 

如果您嘗試使用默認的地圖類地圖類的實際名稱,然後寫上「Mapper.class」 。

+0

是的,我擁有的地圖類的名字是「mapper」。 – hailah

+0

您是否將hadoop jar添加到eclipse中的構建路徑中? – AkashNegi

+0

是的。我將所有的hadoop罐子都添加到了項目中。 – hailah