Когда зависимые от пакета библиотеки в папке "lib" jar задания hadoop, возникла исключительная ситуация ClassNotFoundException - PullRequest
3 голосов
/ 27 марта 2012

Я использовал для упаковки зависимых библиотек в папку "lib" jar задания hadoop map-reduction.Это отлично работает.Но на этот раз все пошло не так.Может кто-нибудь дать мне идею решить проблему?Проблема заключается в следующем:

Когда я упаковываю флягу работы с функцией Eclipse «Экспорт» и опцией «Извлечение необходимых библиотек в сгенерированный JAR».Сгенерированный jar работы работает отлично.

Но если я упакую банку задания с помощью ant-script, чтобы включить зависимые библиотеки в папку "lib" в банке работы, я столкнулся с ClassNotFoundException:

java.io.IOException: Split class cascading.tap.hadoop.MultiInputSplit not found
        at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:340)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:365)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
        at org.apache.hadoop.mapred.Child.main(Child.java:264)
    Caused by: java.lang.ClassNotFoundException: cascading.tap.hadoop.MultiInputSplit
        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:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:943)
        at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:338)
        ... 7 more

Может кто-нибудь предоставить некоторыеидея?Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 июня 2014

Баночки - это zip-файлы под крышкой.Таким образом, почему бы вам

  • не переименовать оба jar-файла в zips
  • извлечь их
  • использовать инструменты сравнения файлов / папок для сравнения обеих извлеченных папок (Beyond Compare,WinMerge и т. Д.)

Разница может быть и в манифесте.

После того, как вы узнаете, в чем разница, вам будет проще сконфигурировать ваши инструменты сборки для генерации правильного jarфайлы.

0 голосов
/ 02 апреля 2015

Если вы используете Каскадирование, убедитесь, что JAR, содержащий класс, который вы задали в

_props = new Properties();
AppProps.setApplicationJarClass(_props, MyMain.class);

- это JAR, в котором есть папка 'lib' со всеми зависимостями.

Иногда случается, что JAR (назовем его MyWorkflow.jar), который содержит MyMain.class, находится в своем собственном jar без папки lib , и есть еще один «модуль», который выполняет десять разных функций от запуска каскадного рабочего процесса. Этот мастер-модуль (давайте назовем этот MasterModule.jar) имеет модуль MyWorkflow, определенный как зависимость maven. Поэтому, когда кто-то пытается запустить

hadoop jar MasterModule.jar <options> 

можно ожидать, что все jar-файлы в папке lib MasterModule.jar будут добавлены в classpath TaskTracker ... но Cascading обнаруживает, что MyMain.class принадлежит MyWorkflow.jar и не видит никакой папки lib в MyWorkflow.jar, поэтому вы начинаете видеть ClassNotFoundException ...!

Также обратите внимание, что зависимости папки lib не будут поддерживаться с CDH5. Блог Cloudera

0 голосов
/ 12 ноября 2013

Эта запись решит вашу проблему.

...