AWS Elastic Map Reduce中线程“main”java.lang.NoClassDefFoundError中的异常

时间:2013-06-07 06:57:12

标签: java hadoop amazon-web-services mapreduce elastic-map-reduce

我正在尝试使用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文件选项。

2 个答案:

答案 0 :(得分:2)

默认情况下,第三方依赖项不包含在作业jar中,因此您会看到错误消息。它在Eclipse独立模式下工作,因为Eclipse知道在执行时将jar添加到类路径中。

您有两种选择:

  1. 解压缩这个jar并重新打包你的类和第三方依赖jar到一个'uber'或整体jar - maven有一个jar-with-dependencies程序集用于这样做(如果你使用maven,我会个人推荐)
  2. 使用-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

然后,开始你的工作。