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