4

Я пытаюсь создать свой проект с помощью Eclipse в Windows и выполнить на кластере Linux. Проект зависит от некоторых внешних банок, которые я вложил, используя eclipse «Export-> Runnable JAR -> Package required library in jar» build. Я проверил, что jar содержит классы в структуре папок, а внешние банки находятся в корневой папке.Jar работает с автономным Hadoop, но не на самом кластере (java.lang.ClassNotFoundException: org.jfree.data.xy.XYDataset)

В автономном режиме 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) 

ответ

3

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^