Исключение в потоке main java.lang.NoClassDefFoundError в AWS Elastic Map Reduce

Я пытаюсь запустить задание hadoop на AWS Elastic Map Reduce с использованием файла JAR. Я использую библиотеку под названием EJML https://code.google.com/p/efficient-java-matrix-library/wiki/EjmlManual. Я включил его в свой проект как внешнюю библиотеку, используя проект -> Путь сборки -> Настроить путь сборки -> Добавить внешние банки в Eclipse. Когда я запускаю проект на своем локальном компьютере, все в порядке. Однако на AWS я получаю сообщение об ошибке,

Exception in thread "main" java.lang.NoClassDefFoundError: org/ejml/simple/SimpleBase
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:180)
Caused by: java.lang.ClassNotFoundException: org.ejml.simple.SimpleBase
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)
... 3 more

Мне интересно, что может пойти не так. Мне пришлось перестроить библиотеку для Java 6 вместо 7, потому что hadoop на AWS работает только на Java 6. Буду признателен за любую помощь/предложения. Спасибо

РЕДАКТИРОВАТЬ: простой способ решить проблему в eclipse - выбрать параметр экспорта файла Runnable JAR при экспорте проекта в JAR.


person Timnit Gebru    schedule 07.06.2013    source источник
comment
разархивируйте банку и посмотрите, есть ли там EJM, а также проверьте файл манифеста, чтобы убедиться, что он включен в путь к классам.   -  person Amar    schedule 07.06.2013


Ответы (2)


Сторонняя зависимость по умолчанию не включена в jar-файл задания и, следовательно, сообщение об ошибке, которое вы видите. Он работает в автономном режиме Eclipse, поскольку Eclipse знает, что нужно добавить банку в путь к классам во время выполнения.

У вас есть два варианта:

  1. Распакуйте эту банку и переупакуйте свои классы и банки зависимостей сторонних производителей в одну "uber" или монолитную банку - у maven есть jar-with-dependencies для этого (если вы используете maven, что я лично рекомендую)
  2. Используйте аргумент -libjars в сочетании с ToolRunner. способ отправки заданий — это обеспечит отправку ваших сторонних JAR-файлов вместе с заданием

    hadoop jar myJar.jar -libjars ejml.jar MainClass.class

person Chris White    schedule 07.06.2013

Вам необходимо добавить свои jar-файлы в путь к классам Hadoop в среде AWS перед запуском задания Hadoop.

В терминале сделайте это перед запуском своей работы,

export $EJML_JARS=<your jars here separated by colon ':'>
export HADOOP_CLASSPATH=$EJML_JARS

e.g.

export EJML_JARS=name1.jar:name2.jar:name3.jar
export HADOOP_CLASSPATH=$EJML_JARS

Затем запустите свою работу.

person SSaikia_JtheRocker    schedule 07.06.2013