Я пытаюсь запустить задание MapReduce из файла jar
и продолжать получать ошибку ClassNotFoundException
. Я запускаю Hadoop 1.2.1 на виртуальной машине Centos 6.ClassNotFoundException при запуске hasoop jar
Сначала я составил файл exercise.java
(и класс) в баночке файл exercise.jar
используя следующий скрипт compile.sh
:
#!/bin/bash
javac -classpath /pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar /pathto/exercise.java
jar cvf exercise.jar /pathto/*.class
Это прекрасно работает и баночка завершается успешно. Я затем попытаться запустить фактическую MapReduce работу, используя сценарий оболочки exec.sh
:
#!/bin/bash
export CLASSPATH=$CLASSPATH:/pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar:/pathto/exercise.class
hadoop jar exercise.jar exercise /data/input/inputfile.txt /data/output
This trows ClassNotFoundException
ошибки:
Exception in thread "main" java.lang.ClassNotFoundException: exercise
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:274)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Я понимаю, явные имена путей не могут быть необходимыми, но я был немного отчаянно, чтобы дважды проверить все. Я подтвердил, что в моем exercise.java
файле exercise.class
находится в конфигурации задания через job.setJarByClass(exercise.class);
и подтверждено exercise.class
содержится в exercise.jar
. Кажется, это не понятно.
ОБНОВЛЕНИЕ Сценарий exec.sh с полным путем exercise.class
. Она хранится в моем Затмении директории проекта:
#!/bin/bash
export CLASSPATH=$CLASSPATH:/pathto/hadoop-common-1.2.1.jar:\
/pathto/hadoop-core-1.2.1.jar:/home/username/workspace/MVN_Hadoop/src/main/java.com.amend.hadoop.MapReduce/*
hadoop jar \
exercise.jar \
/home/username/workspace/MVN_Hadoop/src/main/java.com.amend.hadoop.MapReduce/exercise \
/data/input/inputfile.txt \
/data/output
Когда я на самом деле попытаться запустить скрипт exec.sh с использованием явно выписанных имен путей, я также получаю совершенно другой набор ошибок:
Exception in thread "main" java.lang.ClassNotFoundException: /home/hdadmin/workspace/MVN_Hadoop/src/main/java/come/amend/hadoop/MapReduce/exercise
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Предположительно класс определяется как «Упражнение» внутри 'exercise.java', если вы следовали соглашениям Java. Попробуйте сделать 'hadoop jar exercise.jar Exercise /data/input/inputfile.txt/data/output' (capital' E') –
Вам не следует использовать '/ home/username/workspace/MVN_Hadoop/src/main/java .com.amend.hadoop.MapReduce/exercise', так как это ваша ** локальная файловая система **, а не файл класса Java –
@ cricket_007 Я изначально не делал этого, просто разместил его там по запросу srikanth ниже. Если я удаляю его, все равно получаю исходную ошибку ... – gtnbz2nite