1

I am trying to expose an Apache Spark ML code as a REST service using Scalatra.

But while calling the GET on the REST endpoint, I receive the following error:

java.lang.ClassNotFoundException: scala.Some at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) ~[spark-core_2.11-2.0.0.jar:2.0.0]

Do I need to add some additional dependencies?

I have the following dependencies listed in my SBT file:

  lazy val scalatraVersion = "2.3.0"
  lazy val sparkVersion = "2.0.0"
  libraryDependencies ++= Seq(
    "org.scalatra" %% "scalatra" % scalatraVersion,
    "org.scalatra" %% "scalatra-json" % scalatraVersion,
    "org.scalatra" %% "scalatra-commands" % scalatraVersion,
    "org.json4s"   %% "json4s-jackson" % "3.2.9",
    "ch.qos.logback"    %  "logback-classic"   % "1.1.3"            ,
    "org.eclipse.jetty" %  "jetty-webapp"      % "9.2.10.v20150310",
    "com.typesafe.akka" %% "akka-actor" % "2.3.4",
    "org.apache.spark" %% "spark-core" % sparkVersion,
    "org.apache.spark" %% "spark-sql" % sparkVersion,
    "org.apache.spark" %% "spark-mllib" % sparkVersion,
    "com.github.fommil.netlib" % "all" % "1.1.2"
  )

In my scala code IssuePredictor.predict(), I am trying to load the CrossValidatorModel from an already saved file. And this is where the error is thrown: (I know this because, the println statements before this line are printed, but those after it aren't)

val cvModel = CrossValidatorModel.load("/Users/Bjghosh/MyFiles/Apache Spark/ml/tables/IssuePredictorCVModelNB_2.0")

I call my scala code that loads the model, gets the prediction and returns, as shown below:

class ScalatraStep1 extends ScalatraServlet  {

  notFound { "Route not implemented" }

  get("/predict/:rawText") {
    Try { params("rawText").toString }  match {
      case Success(id) => { println(s"Predict rawText: ${params("rawText")} ")
                            val predictor = new IssuePredictor
                            val prediction = predictor.predict(params("rawText"))
                             s"Prediction for rawText: ${params("rawText")} = $prediction} "
                          }
      case Failure(e) => BadRequest(reason = "Can't understand rawText")
    }
  }
}

Error Trace

ERROR org.apache.spark.util.Utils - Exception encountered java.lang.ClassNotFoundException: scala.Some at java.net.URLClassLoader$1.run(URLClassLoader.java:372) ~[na:1.8.0_25] at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.8.0_25] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_25] at java.net.URLClassLoader.findClass(URLClassLoader.java:360) ~[na:1.8.0_25] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_25] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_25] at java.lang.Class.forName0(Native Method) ~[na:1.8.0_25] at java.lang.Class.forName(Class.java:344) ~[na:1.8.0_25] at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) ~[spark-core_2.11-2.0.0.jar:2.0.0] at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) [na:1.8.0_25] at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) [na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) [na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) [na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) [na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) [na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) [na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) [na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) [na:1.8.0_25] at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:501) [na:1.8.0_25] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply$mcV$sp(AccumulatorV2.scala:167) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply(AccumulatorV2.scala:166) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply(AccumulatorV2.scala:166) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1253) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2.readObject(AccumulatorV2.scala:166) [spark-core_2.11-2.0.0.jar:2.0.0] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_25] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_25] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25] at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_25] at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) [na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896) [na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) [na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) [na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) [na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) [na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) [na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) [na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) [na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) [na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) [na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) [na:1.8.0_25] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) [na:1.8.0_25] at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) [spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114) [spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:253) [spark-core_2.11-2.0.0.jar:2.0.0] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25] 12:07:36.845 [Executor task launch worker-0] ERROR org.apache.spark.executor.Executor - Exception in task 0.0 in stage 0.0 (TID 0) java.io.IOException: java.lang.ClassNotFoundException: scala.Some at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1260) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2.readObject(AccumulatorV2.scala:166) ~[spark-core_2.11-2.0.0.jar:2.0.0] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_25] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_25] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25] at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_25] at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) ~[na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896) ~[na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) ~[na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) ~[na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) ~[na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) ~[na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) ~[na:1.8.0_25] at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:253) ~[spark-core_2.11-2.0.0.jar:2.0.0] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25] Caused by: java.lang.ClassNotFoundException: scala.Some at java.net.URLClassLoader$1.run(URLClassLoader.java:372) ~[na:1.8.0_25] at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.8.0_25] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_25] at java.net.URLClassLoader.findClass(URLClassLoader.java:360) ~[na:1.8.0_25] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_25] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_25] at java.lang.Class.forName0(Native Method) ~[na:1.8.0_25] at java.lang.Class.forName(Class.java:344) ~[na:1.8.0_25] at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67) ~[spark-core_2.11-2.0.0.jar:2.0.0] at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) ~[na:1.8.0_25] at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) ~[na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) ~[na:1.8.0_25] at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) ~[na:1.8.0_25] at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) ~[na:1.8.0_25] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[na:1.8.0_25] at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) ~[na:1.8.0_25] at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:501) ~[na:1.8.0_25] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply$mcV$sp(AccumulatorV2.scala:167) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply(AccumulatorV2.scala:166) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.AccumulatorV2$$anonfun$readObject$1.apply(AccumulatorV2.scala:166) ~[spark-core_2.11-2.0.0.jar:2.0.0] at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1253) ~[spark-core_2.11-2.0.0.jar:2.0.0]

Regards, Bhaskar

bjgindia
  • 31
  • 1
  • 7

0 Answers0