我正在尝试使用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选项。
2条答案
按热度按时间x6yk4ghg1#
在运行hadoop作业之前,需要将jar添加到aws环境中的hadoop类路径。
在终端,在运行你的任务之前做这个,
例如。
然后,开始你的工作。
pdkcd3nj2#
默认情况下,jobjar中不包含第三方依赖项,因此会显示错误消息。它在eclipse独立模式下工作,因为eclipse知道在执行时将jar添加到类路径。
您有两个选择:
解压这个jar并将类和第三方依赖jar重新打包到一个单独的“uber”或单片jar中-maven有一个jar和依赖程序集来完成这项工作(如果您使用maven,我个人推荐)
使用
-libjars
参数与提交作业的toolrunner方法相结合-这将确保第三方JAR与作业一起提交hadoop jar myJar.jar -libjars ejml.jar MainClass.class