Руководство по ошпариванию: java.lang.ClassNotFoundException

#scala #hadoop #scalding

#scala #hadoop #ошпаривание

Вопрос:

Пожалуйста, помогите запустить руководство по ошпариванию. У меня есть Hadoop 2.2, запущенный на одном узле, и я пытаюсь запустить руководство по ошпариванию:https://github.com/Cascading/scalding-tutorial / После успешного создания ‘fat jar’ с помощью этих команд:

 $ git clone git://github.com/Cascading/scalding-tutorial.git
$ cd scalding-tutorial
$ sbt assembly
  

Я пытаюсь запустить учебные примеры, как предложено, с помощью этой команды:

 $ yarn jar target/scalding-tutorial-0.8.11.jar <TutorialPart> --local <addtional arguments>
  

Оба —local и —hdfs не работают с java.lang.ClassNotFoundException:

 $ yarn jar target/scala-2.9.3/scalding-assembly-0.10.0.jar 1 --local
Exception in thread "main" java.lang.ClassNotFoundException: 1
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:205)

$ yarn jar target/scala-2.9.3/scalding-assembly-0.10.0.jar 1 --hdfs
Exception in thread "main" java.lang.ClassNotFoundException: 1
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:205)
  

Обновить

Изменение аргумента команды на ‘Tutorial1’, ‘Tutorial0’ также не помогает:

 $ yarn jar target/scala-2.9.3/scalding-assembly-0.10.0.jar Tutorial1 --local
Exception in thread "main" java.lang.ClassNotFoundException: Tutorial1
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:247)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:205)

$ yarn jar target/scala-2.9.3/scalding-assembly-0.10.0.jar Tutorial0 --local
Exception in thread "main" java.lang.ClassNotFoundException: Tutorial0
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:205)
  

Ответ №1:

Вы передаете неправильное имя для основного класса, поэтому он не может его найти. Это должно быть Tutorial1 вместо просто 1 . Вы можете увидеть ошибку в трассировке стека:

 Exception in thread "main" java.lang.ClassNotFoundException: 1
  

Класс не вызывается 1 . Попробуйте:

 $ yarn jar target/scala-2.9.3/scalding-assembly-0.10.0.jar Tutorial1 --local
  

РЕДАКТИРОВАТЬ: для меня это отлично работает с этой командой:

 $ yarn jar target/scalding-tutorial-0.8.11.jar Tutorial1 --local
  

Комментарии:

1. Спасибо, имеет смысл! К сожалению, изменение аргумента команды на ‘Tutorial1’, ‘Tutorial0’ также не помогает, пожалуйста, смотрите «обновление» в моем вопросе.

2. Я только что выполнил шаги руководства, и у меня это сработало… После их просмотра я заметил одну вещь: jar должен быть расположен в target/scalding-tutorial-0.8.11.jar , а не в target/scala-2.9.3/scalding-assembly-0.10.0.jar . Может ли это быть ошибкой? Я отредактировал свой пост с помощью точной команды, которую я использую.

3. Не в моем случае, все равно возникает та же ошибка, независимо от того, куда я поместил этот jar. Еще одна идея: у меня нет JAVA_HOME и JAVA_CLASSPATH, может ли это быть так?

4. Ошибка здесь заключается в том, что он не может найти класс, который вы указываете, так что это не должно быть проблемой… Но что я нахожу странным, так это то, что jar, созданный в вашем случае, имеет другое имя и находится в другой папке. Не могли бы вы удалить его и вызвать sbt assembly снова? Вы сказали «неважно, куда я поместил этот jar», но дело не только в местоположении, в вашей команде имя jar было другим.

5. Но в моем случае sbt assembly (после sbt update clean ) создается один scalding/target/scala-2.9.3/scalding-assembly-0.10.0.jar файл. Почему он не создается target/scalding-tutorial-0.8.11.jar ? Как его создать?