Scala 如何在spark.ml中反序列化管道模型?
我序列化了一个Spark ML管道模型,该模型由许多转换器(org.apache.Spark.ML.Transformer)和几个逻辑回归学习器(org.apache.Spark.ML.classification.Logistic回归)组成。 它在我创建模型的Windows机器上运行良好。我使用java.io.ObjectOutputStream将模型序列化到磁盘,并使用java.io.ObjectOutputStream将其读回 通过sbt和我相应的单元测试,一切都很好。然而,当我将代码组装到jar中并尝试在服务器上的Spark shell中运行相同的代码时,我(第一个)transformer会得到一个ClassNotFoundException。堆栈跟踪包括在下面 我在build.sbt文件中使用fork:=true,因为我认为这可能与相关,但这似乎没有帮助 无论我是尝试从jar文件还是直接从磁盘加载模型(如下所示),都没有区别 如何反序列化管道Scala 如何在spark.ml中反序列化管道模型?,scala,apache-spark,machine-learning,apache-spark-ml,Scala,Apache Spark,Machine Learning,Apache Spark Ml,我序列化了一个Spark ML管道模型,该模型由许多转换器(org.apache.Spark.ML.Transformer)和几个逻辑回归学习器(org.apache.Spark.ML.classification.Logistic回归)组成。 它在我创建模型的Windows机器上运行良好。我使用java.io.ObjectOutputStream将模型序列化到磁盘,并使用java.io.ObjectOutputStream将其读回 通过sbt和我相应的单元测试,一切都很好。然而,当我将代码组装
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-49-generic x86_64)
spark-shell -J-Xmx4g --master local[2] --jars myJar.jar
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.3.0
/_/
Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc.
SQL context available as sqlContext.
scala> import com.myCompany.spark.classifier._
import com.myCompany.spark.classifier._
scala> import java.io._
import java.io._
scala> val l = new LabelTransformer(2)
l: com.myCompany.spark.classifier.LabelTransformer = com.myCompany.spark.classifier.LabelTransformer@61d24347
scala> val l2 = new ObjectInputStream(new FileInputStream("log-reg_2_10.model")).readObject
java.lang.ClassNotFoundException: com.myCompany.spark.classifier.LabelTransformer
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
at scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
at scala.collection.mutable.HashTable$class.init(HashTable.scala:105)
at scala.collection.mutable.HashMap.init(HashMap.scala:39)
at scala.collection.mutable.HashMap.readObject(HashMap.scala:142)
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:497)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
at scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
at scala.collection.mutable.HashTable$class.init(HashTable.scala:105)
at scala.collection.mutable.HashMap.init(HashMap.scala:39)
at scala.collection.mutable.HashMap.readObject(HashMap.scala:142)
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:497)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:25)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:30)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:32)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:34)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:36)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:38)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:40)
at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:42)
at $iwC$$iwC$$iwC$$iwC.<init>(<console>:44)
at $iwC$$iwC$$iwC.<init>(<console>:46)
at $iwC$$iwC.<init>(<console>:48)
at $iwC.<init>(<console>:50)
at <init>(<console>:52)
at .<init>(<console>:56)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
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:497)
at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:856)
at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:901)
at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:813)
at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:656)
at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:664)
at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:669)
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:996)
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:944)
at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1058)
at org.apache.spark.repl.Main$.main(Main.scala:31)
at org.apache.spark.repl.Main.main(Main.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:497)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
欢迎使用Ubuntu 14.04.2 LTS(GNU/Linux 3.13.0-49-generic x86_64)
sparkshell-J-Xmx4g--master local[2]--jars myJar.jar
Spark assembly是用Hive构建的,包括类路径上的Datanucleus JAR
欢迎来到
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/.版本1.3.0
/_/
使用Scala 2.10.4版(Java HotSpot(TM)64位服务器虚拟机,Java 1.8.0(40)
键入要计算的表达式。
键入:有关详细信息的帮助。
Spark上下文作为sc提供。
SQL上下文作为sqlContext可用。
scala>导入com.myCompany.spark.classifier_
导入com.myCompany.spark.classifier_
scala>导入java.io_
导入java.io_
scala>val l=新标签变压器(2)
l:com.myCompany.spark.classifier.LabelTransformer=com.myCompany.spark.classifier。LabelTransformer@61d24347
scala>val l2=新对象输入流(新文件输入流(“log-reg_2_10.model”)).readObject
java.lang.ClassNotFoundException:com.myCompany.spark.classifier.LabelTransformer
位于java.net.URLClassLoader.findClass(URLClassLoader.java:381)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
位于java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
位于java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
位于scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
位于scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
位于scala.collection.mutable.HashTable$class.init(HashTable.scala:105)
位于scala.collection.mutable.HashMap.init(HashMap.scala:39)
位于scala.collection.mutable.HashMap.readObject(HashMap.scala:142)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
位于scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
位于scala.collection.mutable.HashMap$$anonfun$readObject$1.apply(HashMap.scala:142)
位于scala.collection.mutable.HashTable$class.init(HashTable.scala:105)
位于scala.collection.mutable.HashMap.init(HashMap.scala:39)
位于scala.collection.mutable.HashMap.readObject(HashMap.scala:142)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
在java.io.ObjectInpu