2014-09-20 108 views
5

我使用spark 0.91MLlib 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演示的配置,构建和部署蚂蚁但同样我面对了同样的错误

+1

这让我不知道你们是否是肯定的Scala编译器,JVM和您正在构建包的Spark/mllib库与您的独立Spark安装中的相同。此外,如果有帮助,我会指出在后续的Spark版本中,使用org.jblas.DoubleMatrix从GradientDescent代码中消失(尽管不是来自mllib的其余部分) - 从1.0.0开始。 – 2014-09-23 05:26:21

+0

@SpiroMichaylov一切都是一样的。配置(从sc.getConf复制)scala版本和JMV。也使用与REPL完全相同的库。也许repl在本地运行,问题在于分布式工作人员。 – weakwire 2014-09-27 21:53:16

+0

@SpiroMichaylov请检查更新 – weakwire 2014-09-28 09:09:08

回答

1

这确实似乎是一个类加载问题。特别是,我相信你打到this bug,固定在1.0。

您不能在另一个类加载器中转换由一个类加载器加载的类的对象。

通过手动更改上下文类加载器,您可能找到解决方案的机会很小。它要求你实际上可以获得一个适当的类加载器的引用,对于你的情况可能或不可能。喜欢的东西:

Thread.currentThread().setContextClassloader(...) 

但是因为我一窍不通DSE,我得请您看看这篇文章: http://www.datastax.com/dev/blog/classloading-in-dse-analytics