【问题标题】:When package dependant libraries in the "lib" folder of the hadoop job jar, ClassNotFoundException encountered在hadoop作业jar的“lib”文件夹中打包依赖库时,遇到ClassNotFoundException
【发布时间】: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


【解决方案1】:

如果您使用的是 Cascading,请确保包含您在中设置的类的 JAR

_props = new Properties();
AppProps.setApplicationJarClass(_props, MyMain.class);

是具有所有依赖项的“lib”文件夹的 JAR。

有时,包含 MyMain.class 的 JAR(我们称之为 MyWorkflow.jar)在其自己的 jar 中没有 lib 文件夹,并且还有另一个“模块”可以做十种不同的事情除了调用级联工作流程。这个主模块(我们称之为 MasterModule.jar)将 MyWorkflow 模块定义为 maven 依赖项。所以当一个人试图运行时

hadoop jar MasterModule.jar <options> 

人们会期望 MasterModule.jar lib 文件夹中的所有 jars 都添加到 TaskTracker 的类路径中......但 Cascading 发现 MyMain.class 属于 MyWorkflow.jar 并且在 MyWorkflow.jar 中看不到任何 lib 文件夹,因此您开始看到ClassNotFoundException...!

另请注意,CDH5 不支持 lib 文件夹依赖项。 Cloudera Blog

【讨论】:

    【解决方案2】:

    罐子是封面下的 zip 文件。 那么,你为什么不呢

    • 将两个 jar 重命名为 zips
    • 提取它们
    • 使用文件/文件夹比较工具比较两个提取的文件夹(Beyond Compare、WinMerge 等)

    差异也可能体现在明显方面。

    知道区别后,配置构建工具以生成正确的 jar 文件会更容易。

    【讨论】:

      【解决方案3】:

      post 将解决您的问题。

      【讨论】:

        猜你喜欢
        • 2013-07-06
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 2014-04-25
        • 2019-06-19
        • 2019-06-30
        • 2013-03-04
        • 2014-03-18
        相关资源
        最近更新 更多