2013-05-30 76 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好奇地知道這個解決方案是否適用於你 –