使用Spark和IntelliJ时出现NoSuchMethodError错误

4

我对Scala和Spark还很陌生。在使用IntelliJ时,我发现很难让事情顺利运行。目前,我无法运行以下代码。我相信这只是一些简单的问题,但我无法使它正常工作。

我正在尝试运行:

import org.apache.spark.{SparkConf, SparkContext}

object TestScala {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setAppName("Datasets Test")
    conf.setMaster("local[2]")
    val sc = new SparkContext(conf)
    println(sc)
  }
}

我遇到的错误是:

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
at org.apache.spark.util.Utils$.getCallSite(Utils.scala:1413)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:77)
at TestScala$.main(TestScala.scala:13)
at TestScala.main(TestScala.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:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

我的build.sbt文件:

name := "sparkBook"

version := "1.0"

scalaVersion := "2.12.1"

我在这里提供帮助,不要沮丧。请给我看你的 build.sbt 文件? - Nagarjuna Pamu
@pamu,我现在遇到了不同的错误。它无法识别一个方法。我已经添加了sbt构建文件。 - lars
@lars你的build.sbt文件中没有包含Spark依赖项。为什么? - Nagarjuna Pamu
我正在跟随(https://www.ibm.com/developerworks/community/files/basic/anonymous/api/library/e5c0146d-f723-446b-9151-c31d4c56ed01/document/b41505ac-141b-45a2-84cd-1b6a8d5ae653/media/Setting%20up%20spark%202.0%20with%20intellij%20community%20edition.pdf)的内容。 - lars
https://dev59.com/xF7Fs4gBPY-HTNNj3kfn - Dmytro Mitin
显示剩余3条评论
3个回答

5

将您的scalaVersion更改为2.11.8,并将Spark依赖项添加到您的build.sbt中:

libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.0.2"


使用libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"更符合惯用语,不是吗? - Angelo Genovese
@AngeloGenovese 你说得对,这种方法更符合惯用语,但我还是有点犹豫提出来,因为如果Scala版本更改为2.12,则构建将在没有发布Spark的情况下失败。至少从我看到的情况来看,如果开发人员不知道 %% vs % 的语义,这种情况并不容易调试。 - The_Tourist
是的,也许是这样,但是当我遇到这个奇怪的错误时,我面临着更大的问题: https://github.com/sbt/zinc/issues/276,其中“compiler-bridge_2.11”包无法编译。Scala 2.11.0、2.11.8和2.11.11都无法工作,但2.11.12可以! - seb

2

还有一种情况是IntelliJ指向2.12.4,而所有的Maven / SBT依赖项都是2.11.8。Scala dep版本为2.11...

我退回到Intellij UI的全局库中的2.11.8,并且它开始工作了。

详细信息:

Maven pom.xml指向2.11.8,但在我的Intellij中... sdk是显示在全局库中的2.12.4。

这是导致问题的原因。
java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;

在这里输入图片描述 在全局库中回退到2.11.8,如下所示:

在这里输入图片描述 就是这样。问题解决了。再也没有执行该程序时出错的情况。

结论: 仅使用Maven依赖不能解决问题,还必须在全局库中配置Scala SDK,因为当运行Spark本地程序时出现错误,而且错误与Intellij运行时有关。


0
如果您使用的是Spark 2.4.3,则需要使用Scala 2.11,即使Spark网站建议使用Scala 2.12。https://spark.apache.org/docs/latest/ 为了避免scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object;错误。

我怎样才能使用 scale 2.12? - user1735921

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