我在DSE上使用spark 0.91
和MLlib 0.91
尝试在独立模式下运行以下代码时
val parsedData = sc.parallelize((1 to 1000).
map {
line =>
LabeledPoint(0.0, Array(0.0, 0.4, 0.3))
})
val numIterations = 2
val model = LinearRegressionWithSGD.train(parsedData, numIterations)
我收到此错误:
14/09/20 14:28:37 ERROR OneForOneStrategy: org.jblas.DoubleMatrix cannot be cast to org.jblas.DoubleMatrix
java.lang.ClassCastException: org.jblas.DoubleMatrix cannot be cast to org.jblas.DoubleMatrix
at org.apache.spark.mllib.optimization.GradientDescent$$anonfun$runMiniBatchSGD$1$$anonfun$2.apply(GradientDescent.scala:150)
at org.apache.spark.mllib.optimization.GradientDescent$$anonfun$runMiniBatchSGD$1$$anonfun$2.apply(GradientDescent.scala:150)
at org.apache.spark.rdd.RDD$$anonfun$6.apply(RDD.scala:677)
at org.apache.spark.rdd.RDD$$anonfun$6.apply(RDD.scala:674)
at org.apache.spark.scheduler.JobWaiter.taskSucceeded(JobWaiter.scala:56)
at org.apache.spark.scheduler.DAGScheduler.handleTaskCompletion(DAGScheduler.scala:846)
at org.apache.spark.scheduler.DAGScheduler.processEvent(DAGScheduler.scala:601)
仅在尝试运行独立应用程序时才会发生这种情况。它适用于火花壳(dse spark)。
有任何想法吗?
更新:
当我在REPL上创建对象时,getClassLoader返回:
scala> new org.jblas.DoubleMatrix().getClass().getClassLoader()
res3: ClassLoader = ModuleClassLoader:Analytics
但是当我在独立模式下运行(带有火花类)时,它将返回
new org.jblas.DoubleMatrix().getClass().getClassLoader():
class= SystemClassLoader
也许这是一个提示。
我使用SBT生成jar,并使用spark-class提交它。这是配置
name := "analytics"
version := "1.0"
scalaVersion := "2.10.3"
unmanagedJars in Compile ++=
Attributed.blankSeq((file("./dse/lib/") * "*.jar").get)
unmanagedJars in Compile ++=
Attributed.blankSeq((file("./dse/resources/spark/lib/") * "*.jar").get)
unmanagedJars in Compile ++=
Attributed.blankSeq((file("./dse/resources/cassandra/lib/") * "*.jar").get)
unmanagedJars in Runtime ++=
Attributed.blankSeq((file("./dse/resources/hadoop/") * "*.jar").get)
unmanagedJars in Runtime ++=
Attributed.blankSeq((file("./dse/resources/hadoop/lib/") * "*.jar").get)
unmanagedJars in Compile ++=
Attributed.blankSeq((file("./dse/resources/driver/lib/") * "*.jar").get)
更新2:
使用dse演示的配置与ant一起构建和部署,但我再次遇到相同的错误
最佳答案
这确实似乎是一个类加载问题。特别是,我相信您正在按1.0中修复的this bug。
您不能将一个类加载器加载的类的对象转换为另一类加载器。
您极有可能通过手动更改上下文类加载器找到解决方案。它要求您实际上可以获取对适当的类加载器的引用,这在您的情况下可能是不可能的。就像是:
Thread.currentThread().setContextClassloader(...)
但是,由于我对DSE一无所知,因此我必须向您推荐这篇文章:
http://www.datastax.com/dev/blog/classloading-in-dse-analytics