【问题标题】:SparkSubmit Exception (NoClassDefFoundError), even though SBT compiles and packages sucessfullySpark提交异常(NoClassDefFoundError),即使SBT编译打包成功
【发布时间】:2018-02-01 08:52:48
【问题描述】:

我想将 ShapeLogic Sc​​alaSpark 结合使用。我正在使用 Scala 2.11.8Spark 2.1.1ShapeLogic Sc​​ala 0.9.0。 我成功导入了类以使用 Spark 管理图像。此外,我成功编译并打包(通过使用 SBT)以下应用程序,以便将其提交到集群。

以下应用程序只是打开一个图像并将其写入一个文件夹:

// imageTest.scala
import org.apache.spark.sql.SparkSession
import org.shapelogic.sc.io.LoadImage
import org.shapelogic.sc.image.BufferImage
import org.shapelogic.sc.io.BufferedImageConverter

object imageTestObj {
    def main(args: Array[String]) { 
        // Create a Scala Spark Session
        val spark = SparkSession.builder().appName("imageTest").master("local").getOrCreate();

        val inPathStr = "/home/vitrion/IdeaProjects/imageTest";
        val outPathStr = "/home/vitrion/IdeaProjects/imageTest/output";
        val empty = new BufferImage[Byte](0, 0, 0, Array());
        var a = Array.fill(3)(empty);
        for (i <- 0 to 3) {
            val imagePath = inPathStr + "IMG_" + "%01d".format(i + 1);
            a(i) = LoadImage.loadBufferImage(inPathStr);
        }
        val sc = spark.sparkContext;
        val imgRDD = sc.parallelize(a);
        imgRDD.map { outBufferImage =>
            val imageOpt = BufferedImageConverter.bufferImage2AwtBufferedImage(outBufferImage)
            imageOpt match {
                case Some(bufferedImage) => {
                    LoadImage.saveAWTBufferedImage(bufferedImage, "png", outPathStr)
                    println("Saved " + outPathStr)
                }
                case None => {
                    println("Could not convert image")
                }
            }
        }
    } 
}

这是我的 SBT 文件

name := "imageTest"

version := "0.1"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "2.1.1" % "provided",
  "org.apache.spark" % "spark-sql_2.11" % "2.1.1" % "provided",
  "org.shapelogicscala" %% "shapelogic" % "0.9.0" % "provided"
)

但是,出现以下错误。执行 package SBT 命令时,ShapeLogic Sc​​ala 依赖项似乎未包含在应用程序 JAR 中:

[vitrion@mstr scala-2.11]$ pwd
/home/vitrion/IdeaProjects/imageTest/target/scala-2.11
[vitrion@mstr scala-2.11]$ ls
classes  imagetest_2.11-0.1.jar  resolution-cache
[vitrion@mstr scala-2.11]$ spark-submit --class imageTestObj imagetest_2.11-0.1.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/shapelogic/sc/image/BufferImage
    at imageTestObj.main(imageTest.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:743)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.shapelogic.sc.image.BufferImage
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 10 more

希望有人能帮我解决? 非常感谢

【问题讨论】:

    标签: scala apache-spark sbt


    【解决方案1】:

    这个错误说明了一切:

    Caused by: java.lang.ClassNotFoundException: org.shapelogic.sc.image.BufferImage
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    

    添加这个缺少的依赖项(ShapeLogic 类)------> org.shapelogic.sc.image.BufferImage,应该可以解决问题。 Maven 或 SBT 都应该给出相同的错误,如果你错过了这个依赖!

    由于您使用的是集群模式,您可以在 spark-submit 上使用--jars 直接添加依赖项,请关注此post 了解更多详细信息。

    这些主题可能会对您有所帮助: Link1 Link2

    【讨论】:

    • 非常感谢您的回复。我了解打包应用程序时 JAR 文件中不包含 BufferImage 类。但是,我怎样才能包含它?前面说了,SBT编译打包成功
    • @Vitrion 你是在集群模式还是客户端模式下工作?看到这个stackoverflow.com/questions/34272426/… 可能对你有帮助
    • 是的,我在集群模式下工作。一切都有道理。我已经使用附加的 JAR 文件 (ShapeLogic Sc​​ala JAR) 提交了应用程序,并且一切正常。非常感谢!
    • 如果你修改你的原始回复会很棒,所以任何面临这个问题的人也可以解决它。所以,我会把它标记为解决方案。
    • 我已经更新了答案,不要忘记接受答案。
    【解决方案2】:

    默认情况下,您在 sbt 文件中列出的依赖项不会包含在您提交给 spark 的 jar 中,因此对于 sbt,您必须使用插件构建一个包含 shapelogicscala 类的 uber/fat jar .您可以使用 SO 上的此链接,How to build an Uber JAR (Fat JAR) using SBT within IntelliJ IDEA? 了解如何使用 sbt 进行管理。

    【讨论】:

    • 好的。让我试试。非常感谢
    • 好的。我使用了相同的方法,但使用 Maven 并且它有效。
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2018-10-08
    • 2020-01-07
    相关资源
    最近更新 更多