当“中的程序包依赖库”;lib";hadoop作业jar的文件夹,遇到ClassNotFoundException

当“中的程序包依赖库”;lib";hadoop作业jar的文件夹,遇到ClassNotFoundException,hadoop,classnotfoundexception,Hadoop,Classnotfoundexception,我曾经将依赖库打包到Hadoop map reduce作业jar的“lib”文件夹中。那很好。但这一次出了问题。有人能给我一些解决这个问题的办法吗?问题如下: 当我用Eclipse的“Export”函数和“Extract required libraries into generated jar”选项打包作业jar时。生成的作业jar工作正常 但是,如果我用ant脚本打包作业jar,将依赖库包含在作业jar的“lib”文件夹中,我会遇到ClassNotFoundException: java.i

我曾经将依赖库打包到Hadoop map reduce作业jar的“lib”文件夹中。那很好。但这一次出了问题。有人能给我一些解决这个问题的办法吗?问题如下:

当我用Eclipse的“Export”函数和“Extract required libraries into generated jar”选项打包作业jar时。生成的作业jar工作正常

但是,如果我用ant脚本打包作业jar,将依赖库包含在作业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

有人能提供一些想法吗?

这会解决您的问题。

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

  • 将两个罐子重命名为zips
  • 拔出
  • 使用文件/文件夹比较工具比较两个提取的文件夹(Beyond compare、WinMerge等)
差异也可能是显而易见的


在您了解了区别之后,配置构建工具以生成正确的jar文件将更容易。

如果您使用的是级联,那么请确保包含您在中设置的类的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> 
hadoop jar MasterModule.jar 可以预期MasterModule.jar lib文件夹中的所有jar都会添加到TaskTracker的类路径中。。。但是级联发现MyMain.class属于MyWorkflow.jar&在MyWorkflow.jar中看不到任何lib文件夹,所以您开始看到ClassNotFoundException

还请注意,CDH5不支持库文件夹依赖项。

而且您绝对确定jar在lib文件夹中包含依赖jar-jar-tvf myJar.jar是否符合此条件?提取两个jar:一个是由eclipse创建的,另一个是由ant创建的,…您是否看到任何差异?我猜ant文件中可能缺少一些东西,这可能是造成这种情况的原因。是的,我确信类在那里。它是一个级联类。我检查过很多次了。甚至我也在ant生成的作业jar中解压级联类文件。问题仍然存在。试试这个。你用过Job.setJarByClass吗?