2012-06-11 4 views
0

Я получаю исключение classnotfound. Класс, который, как утверждается, не найден, не существует, но имя класса задается как путь к списку входных файлов для моей работы по сокращению карты.Hadoop: странный ClassNotFoundException

INFO server Running: /usr/lib/hadoop/bin/hadoop --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf jar tmp.jar /user/hduser/datasets/ /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20 

Exception in thread "main" java.lang.ClassNotFoundException: /user/hduser/datasets/ 

at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at org.apache.hadoop.util.RunJar.main(Runjar.java:190) 

Как мы можем видеть, /user/hduser/datasets/ путь к входным файлам. Почему я получаю эту ошибку как ClassNotFoundException? Почему он видит это как класс?


Я нашел свою собственную ошибку. У меня есть структура пакета. Мне нужно указать информацию о своем пакете

/usr/lib/hadoop/bin/hadoop 
    --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf 
    jar tmp.jar org.myorg.tmp /user/hduser/datasets/ 
    /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20 

В моем инструменте нет возможности предоставить пакет в качестве аргумента Java. Поэтому мне не нужно иметь упаковку. Но тогда у меня есть следующая ошибка, поскольку аргумент до того, как этот путь к входному файлу отсутствует.

Мои классы находятся непосредственно в tmp.jar в корне. Я не имею в виду не org.myorg и т.д. ...

РЕШЕНИЕ:

jar cmf [manifest_file] [jar_name.jar] -C [folder_of_classes] [path_for_jar_file] 

будет сливаться содержание manifest_file с сгенерированного файла манифеста в архиве JAR. Включите следующую строку в manifest_file Main-Class: [Name_Of_Class]

ответ

2

ли или нет, есть иерархия пакетов (а если нет, то вы сделали что-то неправильно) вы еще нужно дать его в имя класса, содержащего main.

Например, the docs имеет пример, где основной класс org.myorg.WordCount. Даже если WordCount был в пакете по умолчанию, он должен быть указан, если файл банка не включает в себя главный класс в манифесте:

bin/hadoop jar /usr/joe/wordcount.jar WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output 

Я предполагаю, что вы могли бы также указать главный класс в манифесте, как с любой баночкой; аргумент класса показан как необязательный в тех же документах.

+0

Да, проблема в том, что у меня нет возможности печатать WordCount после аргумента jar. Как я могу указать его в файле манифеста? Разве он не уточняется, поскольку существует только внешний класс с основным методом? – Bob

+0

@Bob Нет, JVM не сканирует все классы на пути к классам, чтобы увидеть, есть ли только один psvm. Что значит «у вас нет возможности» включить класс? Подробнее см. В [Спецификация Jar-файла] (http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html), в частности [Main-Class] (http: // docs .oracle.com/javase/6/docs/technotes/guides/jar/jar.html # Main% 20Attributes). –

+0

Я использовал специальный инструмент, который требует, чтобы файл манифеста содержал информацию основного класса. – Bob