【问题标题】:Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.longArrayOps([J)[J线程“主”java.lang.NoSuchMethodError 中的异常:scala.Predef$.longArrayOps([J)[J
【发布时间】:2019-06-30 06:21:03
【问题描述】:

我有一个简单的 Scala 对象,它创建一个 RDD,然后收集并打印出所有元素。

我在 Eclipse 上创建了一个 Maven 项目并添加了 Scala 库 2.12.3 在 pom.xml 中,我添加了 spark 2.4.3 依赖项,如下所示:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>2.4.3</version>
</dependency>

最后,我创建了一个 JAR,然后尝试执行 spark-submit 但这失败了

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.longArrayOps([J)[J
    at org.spark.learning.Demo$.main(Demo.scala:14)
    at org.spark.learning.Demo.main(Demo.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 org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

罪魁祸首似乎是我的 scala 代码中的 r1.collect.foreach(println) ,其中 r1 是从 range(1,50) 创建的 rdd

是的,我在 Eclipse 和终端上都有 Scala 2.12.3 和 Spark 2.4.3,所以版本不兼容似乎不是这里的问题。

有人可以帮忙吗?

【问题讨论】:

标签: java scala apache-spark


【解决方案1】:

这是明确的版本问题。即使您声称使用 2.12.x 似乎也没有其他东西指向旧版本的 scala 尝试清理和构建。验证您正在使用的 maven 或 sbt 中的依赖关系。

也可以 文件 -> 项目结构 -> 全局库 -> 移除 SDK -> 重建

如果您使用 intellij,则类路径下的所有外部库都将如下图所示...在外部库部分下列出。

一种查找衰减的方法是使用类加载器...

val  urls = urlsinclasspath(getClass.getClassLoader).foreach(println)


def urlsinclasspath(cl: ClassLoader): Array[java.net.URL] = cl match {
    case null => Array()
    case u: java.net.URLClassLoader => u.getURLs() ++ urlsinclasspath(cl.getParent)
    case _ => urlsinclasspath(cl.getParent)
  }


使用它,您可以打印项目类路径中的所有 jar,这些 jar 位于您从 intellij 或使用集群的驱动程序运行的项目中。

【讨论】:

  • 谢谢@Ram 我在 pom.xml &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;junit&lt;/groupId&gt; &lt;artifactId&gt;junit&lt;/artifactId&gt; &lt;version&gt;3.8.1&lt;/version&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt;987654324@中列出了以下依赖项
  • &lt;!-- https://mvnrepository.com/artifact/org.scala-lang/scala-library --&gt; &lt;dependency&gt; &lt;groupId&gt;org.scala-lang&lt;/groupId&gt; &lt;artifactId&gt;scala-library&lt;/artifactId&gt; &lt;version&gt;2.12.3&lt;/version&gt; &lt;/dependency&gt; &lt;!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core --&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.spark&lt;/groupId&gt; &lt;artifactId&gt;spark-core_2.12&lt;/artifactId&gt; &lt;version&gt;2.4.3&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;/project&gt;
  • 同样在我的 Eclipse IDE 中,Scala 库容器 [2.12.3] 作为 Maven 项目的一部分被导入。
  • 在我的终端中,scala 版本是 Scala 代码运行器版本 2.12.3 -- 版权所有 2002-2017,LAMP/EPFL 和 Lightbend, Inc.
  • 好的,我刚刚检查了 Spark 2.4.3 正在使用的 Scala 版本,它似乎是 2.11.12 ./spark-submit --version Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ / __/ / /___/ .__/\_,_/_/ /_/\_\ version 2.4.3 /_/ **Using Scala version 2.11.12** OpenJDK 64-Bit Server VM, 1.8.0_212 Branch Compiled by user on 2019-05-01T05:08:38Z Revision 如何让 Spark 2.4.3 在 Scala 2.12 上运行。 3?
猜你喜欢
  • 2017-08-28
  • 2014-06-11
  • 2021-08-18
  • 2017-05-02
  • 1970-01-01
  • 2019-09-24
  • 2017-04-12
  • 1970-01-01
  • 2019-06-18
相关资源
最近更新 更多