4

我正在尝试在 Windows 上使用 Eclipse 构建我的项目并在 Linux 集群上执行。该项目依赖于一些外部 jars,我使用 eclipse 的“Export->Runnable JAR -> Package required library into jar”构建选项附上了这些 jars。我检查了 jar 包含文件夹结构中的类,并且外部 jar 位于根文件夹中。

在独立的 Hadoop、Cygwin 和 Linux 上,这可以正常工作,但在实际的 Hadoop Linux 集群上,它会失败,当它尝试从第一个外部 jar 访问一个类时,会抛出一个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)
4

2 回答 2

3

Java can not use jars that are in other jar:/ (classloaders can't handle this)

So what you have to do is to install those packages separately on each machine in cluster, or if not possible add jars on the run, to do this you have to add option -libjars mylib.jar when running hadoop jar myjar.jar -libjars mylib.jar and this should work.

于 2010-08-04T22:30:13.057 回答
1

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

但是,如果您的外部 jar 不经常更改,您可能会发现手动将 jar 文件复制到节点的 hadoop/lib 更方便。重新启动 Hadoop 后,您的外部 jar 将被添加到作业的类路径中。

于 2011-09-27T20:07:13.857 回答