2013-05-30 28 views
2

所以通过很多帖子要去SO和修改一些Java基础知识后,我仍然得到这个错误NoClassDefFoundError的错误在Hadoop中

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/io/Writable 
at java.lang.Class.getDeclaredMethods0(Native Method) 
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
at java.lang.Class.getMethod0(Class.java:2694) 
at java.lang.Class.getMethod(Class.java:1622) 
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 

我知道java.lang.NoClassDefFoundError,并在Java中ClassNotFoundException之间的差别,并通过什么平常看导致它。简而言之,这是因为某些类在运行时期间对程序不可用,但在编译期间可用。因此我没有编译时错误。

我已经添加了两个类路径,一个到commons-logging-1.1.3.jar,另一个到hadoop-core.*jar。 我非常相信类路径是正确的。

下面是我在程序的进口

import java.io.*; 
import org.apache.hadoop.io.SequenceFile; 
import org.apache.hadoop.io.SequenceFile.*; 
import org.apache.hadoop.io.SequenceFile.Writer; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.io.Writable; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.*; 
+0

这个类是在hadoop-core jar中,你能写出你如何运行你的工作(包括classpath)吗? –

+0

@CharlesMenguy我使用Ubuntu 12.04,这是编译它的命令行 javac -cp“/home/hduser/hadoop/hadoop-core-1.1.2.jar:/home/hduser/Documents/commons-logging-1.1 .3/commons-logging-1.1.3.jar“TSVtoSeq.java 要运行, java TSVtoSeq TrainingT1.tsv testOutput 2个参数传递给main,输入文件和输出文件 – SLearner

+0

您是不是用'java设置类路径-cp $ JARS'当你运行你的程序? –

回答

2

你需要创建一个罐子出来的java代码等给出here

$ mkdir my_classes 
$ javac -classpath $HADOOP_HOME/hadoop-$HADOOP_VERSION-core.jar -d my_classes <name of the main class> 
$ jar -cvf <name of the jar> -C my_classes . 

运行jar这样:

$HADOOP_HOME/bin/hadoop jar <name of the jar> <name of the main class> <arguments to the program> 

查看hadoop的documentation page以查看jar命令的说明。

+0

感谢您的回复。我已经完成了他们在他们的文档[这里]询问(http://hadoop.apache.org/docs/r0.18.3/mapred_tutorial.html#Usage) 在运行时,我得到一个新的错误,这是: **线程“main”中的异常java.lang.ClassNotFoundException:WordCount ** – SLearner

+0

@shashlearner我给出的是wordcount示例。不要盲目地使用该命令。你需要用你的类名替换。 –

+0

@shashlearner好奇地知道这个解决方案是否适用于你 –