java.lang.NoClassDefFoundError spark-submit使用来自其他项目的类

时间:2014-12-02 15:59:32

标签: java eclipse maven apache-spark

我写了一些简单的spark-java代码。 我使用maven在eclipse中编译它。然后用spark-submit启动它。一切正常。

但是现在我尝试使用Eclipse中另一个项目的类(这不是maven项目)。它是OpenRefine(googlerefine)。而且我想使用我在eclipse中添加到buildpath的json.jar。

所以我这样导入它:

import org.json.simple.parser.JSONParser;
import com.google.refine.operations.OnError; //form other project
import com.google.refine.operations.cell.TextTransformOperation; //from other project

eclipse并没有将其标记为错误。与maven一起编译也给了我" BUILD SUCCESS"。

但是在运行时我收到了这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/refine/operations/OnError
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
    at java.lang.Class.getMethod0(Class.java:2774)
    at java.lang.Class.getMethod(Class.java:1663)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:325)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: com.google.refine.operations.OnError
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.sec

使用com.google.refine.operations.OnError删除我的代码时,我收到与JSONParser相同的错误。

任何人都可以帮助我吗?我不知道该怎么做

编辑:现在json.jar在调用spark-submit时添加了这个参数对我有用:

--jars /path/to/json-simple-1.1.jar

其他类没有.jar文件。我想知道是否有可能将它们添加到运行时类路径中,或者我是否必须构建自己的.jar文件,这将非常棘手。因为openRefine是一个很大的项目,我不知道如何获得一个罐子。

2 个答案:

答案 0 :(得分:1)

这意味着持有com.google.refine.operations.OnError的jar或eclispe项目位于编译时类路径中,但不在运行时类路径上。

答案 1 :(得分:1)

解决方案是将所有OpenRefine Java源代码(OpenRefine / main / src)包含到您的maven项目的src目录中,并创建一个包含OpenRefine的jar文件。

尽管spark文档(link)建议您使用maven-shade-plugin生成包含所有依赖项的jar文件,但由于OpenRefine项目不使用maven,因此无法帮助您解决问题

创建jar文件后,您可以在提交spark job之前确认其中包含OpenRefine类:

$ jar tf "<the jar file you created>"
...
com/google/refine/operations/OnError.class
...

一旦包含类,请使用jar文件调用spark-submit命令。 Spark驱动程序和执行程序可以在运行时类路径中找到它们。

请注意,OpenRefine具有以下许可证。因此,只要您遵循它,它就不会禁止将源代码包含在您的项目中。 https://github.com/OpenRefine/OpenRefine/blob/master/LICENSE.txt