线程“main”java.lang.noclassdeffounderror中出现异常

qrjkbowd  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(631)

我正在尝试使用jar文件在aws弹性map reduce上运行hadoop作业。我正在使用一个名为ejml的库https://code.google.com/p/efficient-java-matrix-library/wiki/ejmlmanual. 我在eclipse中使用project-->build path-->configure build path-->add extrenal jar将它作为外部库包含在项目中。当我在本地计算机上运行项目时,一切正常。但是在aws上我得到了错误,

Exception in thread "main" java.lang.NoClassDefFoundError: org/ejml/simple/SimpleBase
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:180)
Caused by: java.lang.ClassNotFoundException: org.ejml.simple.SimpleBase
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:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 3 more

我想知道会出什么问题。我不得不重新构建这个库以针对Java6而不是Java7,因为aws上的hadoop只在Java6上运行。如有任何帮助/建议,将不胜感激。谢谢
edit:在eclipse中解决这个问题的一个简单方法是在将项目导出到jar中时选择export runnable jar file选项。

x6yk4ghg

x6yk4ghg1#

在运行hadoop作业之前,需要将jar添加到aws环境中的hadoop类路径。
在终端,在运行你的任务之前做这个,

export $EJML_JARS=<your jars here separated by colon ':'>
export HADOOP_CLASSPATH=$EJML_JARS

例如。

export EJML_JARS=name1.jar:name2.jar:name3.jar
export HADOOP_CLASSPATH=$EJML_JARS

然后,开始你的工作。

pdkcd3nj

pdkcd3nj2#

默认情况下,jobjar中不包含第三方依赖项,因此会显示错误消息。它在eclipse独立模式下工作,因为eclipse知道在执行时将jar添加到类路径。
您有两个选择:
解压这个jar并将类和第三方依赖jar重新打包到一个单独的“uber”或单片jar中-maven有一个jar和依赖程序集来完成这项工作(如果您使用maven,我个人推荐)
使用 -libjars 参数与提交作业的toolrunner方法相结合-这将确保第三方JAR与作业一起提交 hadoop jar myJar.jar -libjars ejml.jar MainClass.class

相关问题