Scala代码在Spark中抛出异常

9

我是新手,对于Scala和Spark还不太熟悉。今天我尝试编写了一些代码,并让它在Spark上运行,但出现了异常。

这段代码在本地的Scala中可以正常工作。

import org.apache.commons.lang.time.StopWatch
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ListBuffer
import scala.util.Random

  def test(): List[Int] = {
    val size = 100
    val range = 100
    var listBuffer = new ListBuffer[Int] // here throw an exception
    val random = new Random()
    for (i <- 1 to size)
      listBuffer += random.nextInt(range)
    listBuffer.foreach(x => println(x))
    listBuffer.toList
  }

但是当我将这段代码放到Spark中时,它会抛出一个异常,提示如下:

15/01/01 14:06:17 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0
Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.ObjectRef.create(Ljava/lang/Object;)Lscala/runtime/ObjectRef;
    at com.tudou.sortedspark.Sort$.test(Sort.scala:35)
    at com.tudou.sortedspark.Sort$.sort(Sort.scala:23)
    at com.tudou.sortedspark.Sort$.main(Sort.scala:14)
    at com.tudou.sortedspark.Sort.main(Sort.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:358)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

如果我注释掉下面的代码,那么Spark就可以正常运行。
for (i <- 1 to size)

可以有人解释一下为什么吗?

Sort.scala的第35行是什么? new ListBuffer那一行吗?奇怪的是,它会在稍后删除时引发异常。请发布一个完整的Spark失败示例。 - The Archetypal Paul
2
这似乎是Scala版本不匹配。请检查您正在使用的Scala版本是否与Spark构建时使用的版本以及您运行的集群上的版本相匹配。 - lmm
1个回答

13

感谢@Imm,我已解决此问题。根本原因是我的本地Scala版本为2.11.4,而我的Spark集群运行在1.2.0版本。1.2版本的Spark是由2.10 Scala编译的。

因此解决方案是使用2.10 Scala编译本地代码,并将编译后的jar文件上传到Spark中。一切都正常工作。


你能解释一下你具体做了什么吗?只是在.sbt文件中将scalaVersion := "2.11.4"设置为scalaVersion := "2.10.0"吗? - gsamaras
我和 @gsamaras 有同样的问题。 - HappyCoding
@HappyCoding 我不记得我是怎么解决的,但这是我的经验:https://gsamaras.wordpress.com/code/spark-cluster/ - gsamaras
谢谢!我按照您的建议降级了Scala编译器版本,问题已经解决了。 - HappyCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接