4

我想在Windows上使用Eclipse构建我的项目并在Linux群集上执行。该项目取决于一些外部的jar,我使用eclipse的“Export-> Runnable JAR - >将所需的库包装到jar”封装选项。我检查了jar包含文件夹结构中的类,并且外部jar文件位于根文件夹中。Jar使用独立的Hadoop,但不在实际的群集上(java.lang.ClassNotFoundException:org.jfree.data.xy.XYDataset)

Hadoop上的独立,Cygwin和Linux上,此工作正常,但实际的Hadoop Linux集群上失败了,当它试图从第一外部罐子访问类,扔了ClassNotFoundException

有没有办法强制Hadoop搜索jar,我认为这会奏效。

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不能使用在其他罐子罐子:/(类加载器不能处理这个)

你必须做的那么什么是每台机器上的集群单独安装这些程序包,或如果不可能,在运行时添加罐子,要做到这一点,您必须在运行hadoop jar myjar.jar -libjars mylib.jar时添加选项-libjars mylib.jar,这应该起作用。

1

Wojtek的回答是正确的。使用-libjars会将外部jar放入分布式缓存中,并将它们提供给所有Hadoop节点。

但是,如果您的外部罐子没有频繁更换,您可能会发现将jar文件手动复制到节点的hadoop/lib会更方便。一旦你重新启动Hadoop,你的外部jar就会被添加到你的作业的classpath中。