Jar работает с автономным Hadoop, но не на реальном кластере (java.lang.ClassNotFoundException: org.jfree.data.xy.XYDataset) - PullRequest
4 голосов
/ 17 июля 2010

Я пытаюсь построить свой проект с использованием Eclipse в Windows и выполнить в кластере Linux.Проект зависит от некоторых внешних jar-файлов, которые я вложил с помощью опции сборки eclipse «Export-> Runnable JAR -> Package требуемая библиотека в jar».Я проверил, что jar содержит классы в структуре папок, а внешние jar находятся в корневой папке.

В автономных Hadoop, Cygwin и Linux это работает нормально, но на реальном кластере Hadoop Linux происходит сбой, когдаон пытается получить доступ к классу из первой внешней банки, выбрасывая ClassNotFoundException.

Есть ли способ заставить Hadoop искать банку, я думал, что это сработает.

10/07/16 11:44:59 INFO mapred.JobClient: Task Id : attempt_201007161003_0005_m_000001_0, Status : FAILED
Error: java.lang.ClassNotFoundException: org.jfree.data.xy.XYDataset
 at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
 at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
 at org.akintayo.analysis.ecg.preprocess.ReadPlotECG.plotECG(ReadPlotECG.java:27)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.writeECGImages(BuildECGImages.java:216)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.converSingleECGToImage(BuildECGImages.java:305)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.main(BuildECGImages.java:457)
 at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:208)
 at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:1)
 at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
 at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
 at org.apache.hadoop.mapred.Child.main(Child.java:170)

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

Java не может использовать jar-файлы, находящиеся в других jar-файлах: / (загрузчики классов не могут это обработать)

Итак, вам нужно установить эти пакеты отдельно на каждой машине в кластере или, если это невозможно, добавить jar-файлы на ходу, чтобы сделать это, вы должны добавить опцию -libjars mylib.jar при запуске hadoop jar myjar.jar -libjars mylib.jar, и это должно сделать работа.

1 голос
/ 28 сентября 2011

Wojtek ответ правильный.Использование -libjars поместит ваши внешние jar-файлы в распределенный кеш и сделает их доступными для всех ваших узлов Hadoop.

Однако, если ваши внешние jar-файлы не меняются часто, вам может быть удобнее скопировать jar-файлы в hadoop / lib узла вручную.После перезапуска Hadoop ваш внешний jar будет добавлен в classpath ваших заданий.

...