2013-05-30 5 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 и ClassNotFoundException в Java, и просмотрел что обычно вызывает его. В двух словах это связано с тем, что некоторый класс недоступен для программы во время выполнения, но доступен во время компиляции. Следовательно, я не получаю ошибок времени компиляции.

Я добавил два пути класса, один в 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

Этот класс находится в банке с изогнутым ядром, вы можете точно написать, как вы выполняете свою работу (включая путь к классам)? –

+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 аргумента передаются в основной файл входного файла и вывода – 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 . 

Run банку так:

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

См. documentation page of hadoop для описания команды 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 Любопытно узнать, работает ли это решение для u –

Смежные вопросы