java - Spark MLlib 0.91 org.jblas.DoubleMatrix 错误

标签 java scala classloader apache-spark datastax-enterprise

我在 DSE 上使用 spark 0.91MLlib 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)

只有在尝试运行独立应用程序时才会发生这种情况。它适用于 spark shell (dse spark)。 有什么想法吗?

更新:

当我在 REPL 上创建对象时,getClassLoader 返回:

scala>  new org.jblas.DoubleMatrix().getClass().getClassLoader()
res3: ClassLoader = ModuleClassLoader:Analytics

但是当我以独立模式运行时(使用 spark-class)它返回

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 构建和部署,但我再次遇到相同的错误

最佳答案

这似乎确实是一个类加载问题。特别是,我相信您正在点击 this bug , 已在 1.0 中修复。

您不能将一个类加载器加载的类的对象转换为另一个类加载器。

您通过手动更改上下文类加载器找到解决方案的可能性很小。它要求您实际上可以获得对适当类加载器的引用,这在您的情况下可能会也可能不会。像这样的东西:

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

但由于我对 DSE 一无所知,因此我必须向您推荐这篇文章: http://www.datastax.com/dev/blog/classloading-in-dse-analytics

关于java - Spark MLlib 0.91 org.jblas.DoubleMatrix 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948307/

相关文章:

scala - 在我停止作业之前,Spark Structured Streaming writestream 不会写入文件

java - volatile 变量的突变对所有线程都可见吗?

java - 使用 Maven 在多个线程上同时运行单个 TestNG 测试

java - 调用方法时的异常处理

java - 使用单独的类加载器运行每个 JUnit 测试(不,真的)

java - mockito 与密封包装

java - 跨不同类加载器覆盖默认访问器方法会破坏多态性

java - 如何从 URL 加载图像到 Java Android?代码没有错误,但是不起作用

使用phantm扫描PHP项目时出现Java错误

java - 如何在不知道 avro 模式的情况下在 scala 中读取 Avro 编码的 kafka 消息?