2014-09-20 104 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