我写了一些简单的spark-java代码。 我在eclipse中使用maven编译。然后用spark-submit启动它。一切正常。
但现在我尝试使用 Eclipse 中另一个项目(不是 Maven 项目)中的类。它是OpenRefine(googlerefine)。我还想使用我添加到 eclipse 中的构建路径的 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是一个大项目,我不知道如何获取jar。
最佳答案
解决方案是将所有 OpenRefine Java 源代码 (OpenRefine/main/src) 包含到您的 Maven 项目的 src
目录中,并创建一个包含 OpenRefine 的 jar 文件。
虽然 Spark 文档 ( link ) 建议您使用 maven-shade-plugin 生成包含所有依赖项的 jar 文件,但它对您的情况没有帮助,因为 OpenRefine 项目不使用 maven。
创建 jar 文件后,您可以在提交 Spark 作业之前确认其中包含 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
关于java.lang.NoClassDefFoundError Spark-submit 使用其他项目中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253690/