0

我正在尝试使用 JAR 文件在 AWS Elastic Map Reduce 上运行 hadoop 作业。我正在使用一个名为 EJML https://code.google.com/p/efficient-java-matrix-library/wiki/EjmlManual的库。我使用 project-->Build Path-->Configure Build Path-->Add Extrenal Jars in Eclipse 将它作为外部库包含在我的项目中。当我在本地计算机上运行该项目时,一切都很好。但是在 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 文件选项。

4

2 回答 2

2

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

你有两个选择:

  1. 解压这个 jar 并将你的类和第 3 方依赖 jar 重新打包到一个单独的“uber”或整体 jar 中 - maven 有一个jar-with-dependencies程序集来执行此操作(如果你使用的是 maven,我个人会推荐)
  2. 使用与ToolRunner-libjars方法结合的参数来提交作业 - 这将确保您的 3rd 方 jar 与您的作业一起提交

    hadoop jar myJar.jar -libjars ejml.jar MainClass.class

于 2013-06-07T08:33:29.523 回答
0

在运行 Hadoop 作业之前,您需要将 jars 添加到 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

然后,开始你的工作。

于 2013-06-07T09:09:59.133 回答