我正在尝试使用JAR文件在AWS Elastic Map Reduce上运行hadoop作业。我正在使用一个名为EJML https://code.google.com/p/efficient-java-matrix-library/wiki/EjmlManual的库。 我使用项目将其作为外部库包含在我的项目中 - >构建路径 - >配置构建路径 - >在Eclipse中添加Extrenal Jars。当我在我的本地计算机上运行项目时,一切都很好。但是在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
我想知道可能出现什么问题。我不得不重建库来定位Java 6而不是7,因为AWS上的hadoop只能在Java 6上运行。任何帮助/建议都将受到赞赏。感谢
编辑:在eclipse中解决问题的一种简单方法是在将项目导出到JAR时选择导出Runnable JAR文件选项。
答案 0 :(得分:2)
默认情况下,第三方依赖项不包含在作业jar中,因此您会看到错误消息。它在Eclipse独立模式下工作,因为Eclipse知道在执行时将jar添加到类路径中。
您有两种选择:
使用-libjars
参数结合ToolRunner方法提交作业 - 这将确保您的第三方广告罐随工作一起提交
hadoop jar myJar.jar -libjars ejml.jar MainClass.class
答案 1 :(得分:0)
在运行Hadoop作业之前,您需要将您的jar添加到AWS环境中的Hadoop类路径。
在终端中,在运行作业之前执行此操作,
export $EJML_JARS=<your jars here separated by colon ':'>
export HADOOP_CLASSPATH=$EJML_JARS
e.g。
export EJML_JARS=name1.jar:name2.jar:name3.jar
export HADOOP_CLASSPATH=$EJML_JARS
然后,开始你的工作。