【发布时间】:2012-04-10 17:31:06
【问题描述】:
我曾经将依赖库打包在 Hadoop map-reduce 作业 jar 的“lib”文件夹中。这很好用。但这一次却出错了。有人可以给我一些想法来解决这个问题吗?问题如下:
当我使用 Eclipse 的“导出”功能和“将所需的库提取到生成的 JAR”选项中打包作业 jar 时。生成的作业 jar 工作正常。
但是如果我用ant-script打包job jar以在job jar的“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
谁能提供一些想法?
【问题讨论】:
-
而且您绝对确定 jar 包含 lib 文件夹中的依赖 jar - jar -tvf myJar.jar 是否证实了这一点?
-
提取两个 jar:一个由 eclipse 创建,另一个由 ant 创建,...你看到有什么不同吗?我猜可能是 ant 文件中缺少某些东西,这可能会导致这种情况。
-
是的,我确定课程在那里。这是一个级联类。我检查了很多次。即使我在 ant 生成的作业 jar 中解压级联类文件。问题仍然存在。
-
你用过Job.setJarByClass吗?
标签: hadoop classnotfoundexception