星火MLlib 0.91 org.jblas.DoubleMatrix错误
问题描述:
我使用spark 0.91
与MLlib 0.91
上DSE星火MLlib 0.91 org.jblas.DoubleMatrix错误
当试图在独立模式
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演示的配置,构建和部署蚂蚁但同样我面对了同样的错误
答
这确实似乎是一个类加载问题。特别是,我相信你打到this bug,固定在1.0。
您不能在另一个类加载器中转换由一个类加载器加载的类的对象。
通过手动更改上下文类加载器,您可能找到解决方案的机会很小。它要求你实际上可以获得一个适当的类加载器的引用,对于你的情况可能或不可能。喜欢的东西:
Thread.currentThread().setContextClassloader(...)
但是因为我一窍不通DSE,我得请您看看这篇文章: http://www.datastax.com/dev/blog/classloading-in-dse-analytics
这让我不知道你们是否是肯定的Scala编译器,JVM和您正在构建包的Spark/mllib库与您的独立Spark安装中的相同。此外,如果有帮助,我会指出在后续的Spark版本中,使用org.jblas.DoubleMatrix从GradientDescent代码中消失(尽管不是来自mllib的其余部分) - 从1.0.0开始。 – 2014-09-23 05:26:21
@SpiroMichaylov一切都是一样的。配置(从sc.getConf复制)scala版本和JMV。也使用与REPL完全相同的库。也许repl在本地运行,问题在于分布式工作人员。 – weakwire 2014-09-27 21:53:16
@SpiroMichaylov请检查更新 – weakwire 2014-09-28 09:09:08