2017-08-23 43 views
0

我想使用ShapeLogic Sc​​ala相结合Spark。我正在使用Scala 2.11.8Spark 2.1.1ShapeLogic Sc​​ala 0.9.0。 我成功导入类来管理Spark图像。此外,我已成功编译和打包(通过使用SBT)以下应用程序,以便将其提交到群集。SparkSubmit异常(NoClassDefFoundError),即使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" 
) 

然而,出现以下错误。当执行 SBT命令,好像不包括在应用程序JAR的ShapeLogic斯卡拉依赖性:

[[email protected] scala-2.11]$ pwd 
/home/vitrion/IdeaProjects/imageTest/target/scala-2.11 
[[email protected] scala-2.11]$ ls 
classes imagetest_2.11-0.1.jar resolution-cache 
[[email protected] 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 

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

回答

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

+0

非常感谢您的回复。我知道打包应用程序时,BufferImage类不包含在JAR文件中。但是,我怎么能包括它?正如我之前所说的,SBT编译和打包成功 – Vitrion

+0

更新了答案! – Jordon

+0

@Vitrion你在使用集群模式还是客户端模式?看到这个https://stackoverflow.com/questions/34272426/how-to-give-dependent-jars-to-spark-submit-in-cluster-mode?rq=1可能会帮助你 – Jordon

0

你依赖于SBT文件中列出默认情况下不会在提交给火花,所以对SBT你必须使用一个插件来构建一个超级/脂肪罐子,其中将包括shapelogicscala您的罐子被列入类。您可以在SO,How to build an Uber JAR (Fat JAR) using SBT within IntelliJ IDEA?上使用此链接查看如何使用sbt进行管理。

+0

确定。让我试试看。非常感谢你 – Vitrion

+0

好的。我使用了相同的方法,但与Maven一起工作。 – dumitru