java.lang.NoSuchMethodError:Scala Spark 作业中的 scala.Predef$.refArrayOps

2023-12-11

完整错误:

线程“main”中的异常java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object; 在 org.spark_module.SparkModule$.main(SparkModule.scala:62) 在 org.spark_module.SparkModule.main(SparkModule.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52) 在 org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:845) 在 org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161) 在 org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:184) 在 org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86) 在 org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:920) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

当我在 IntelliJ 中编译并运行代码时,它始终执行得很好。当我将 .jar 作为 Spark 作业(运行时)提交时,会显示该错误。

第 62 行包含:for ((elem, i) <- args.zipWithIndex)。为了确定起见,我注释掉了其余的代码,并且错误一直显示在该行上。

一开始我以为是zipWithIndex的错。然后我把它改成了for (elem <- args)你猜怎么着,错误仍然显示。是个for造成这个?

Google 搜索总是指出用于编译的版本和运行时使用的版本之间的 Scala 版本不兼容,但我无法找到解决方案。

I tried this检查 IntelliJ 使用的 Scala 版本,这里是与 Scala 相关的所有内容模块 > Scala:

enter image description here

然后我做了this检查 Scala 的运行时版本,输出为:

(文件:/C:/Users/me/.gradle/caches/modules-2/files-2.1/org.scala-lang/scala-library/2.12.11/1a0634714a956c1aae9abefc83acaf6d4eabfa7d/scala-library-2.12.11.jar )

版本好像很匹配...

这是我的gradle.build(包括fatJar task)

group 'org.spark_module'
version '1.0-SNAPSHOT'

apply plugin: 'scala'
apply plugin: 'idea'
apply plugin: 'eclipse'

repositories {
    mavenCentral()
}

idea {
    project {
        jdkName = '1.8'
        languageLevel = '1.8'
    }
}

dependencies {
    implementation group: 'org.scala-lang', name: 'scala-library', version: '2.12.11'
    implementation group: 'org.apache.spark', name: 'spark-core_2.12'//, version: '2.4.5'
    implementation group: 'org.apache.spark', name: 'spark-sql_2.12'//, version: '2.4.5'
    implementation group: 'com.datastax.spark', name: 'spark-cassandra-connector_2.12', version: '2.5.0'
    implementation group: 'org.apache.spark', name: 'spark-mllib_2.12', version: '2.4.5'
    implementation group: 'log4j', name: 'log4j', version: '1.2.17'
    implementation group: 'org.scalaj', name: 'scalaj-http_2.12', version: '2.4.2'
}

task fatJar(type: Jar) {
    zip64 true
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    } {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }

    manifest {
        attributes 'Main-Class': 'org.spark_module.SparkModule'
    }

    with jar
}

configurations.all {
    resolutionStrategy {
        force 'com.google.guava:guava:12.0.1'
    }
}

compileScala.targetCompatibility = "1.8"
compileScala.sourceCompatibility = "1.8"

jar {
    zip64 true
    getArchiveFileName()
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    manifest {
        attributes 'Main-Class': 'org.spark_module.SparkModule'
    }

    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'

}

构建(胖)罐子:

gradlew fatJar

在 IntelliJ 的终端中。

运行作业:

spark-submit.cmd .\SparkModule-1.0-SNAPSHOT.jar

在 Windows PowerShell 中。

谢谢

EDIT:

火花提交.cmd and Spark-shell.cmd都显示 Scala 版本2.11.12,所以是的,它们与我在 IntelliJ 中使用的不同(2.12.11)。问题是,在Spark的下载页面, 只有一个Scala 2.12 的 Spark 发行版而且它没有 Hadoop;这是否意味着我必须将我的系统从 2.12 降级到 2.11gradle.build?


我会尝试spark-submit --version知道是什么scala version正在使用spark

With spark-submit --version我得到这个信息

[cloudera@quickstart scala-programming-for-data-science]$ spark-submit --version
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.2.0.cloudera4
      /_/
                        
Using Scala version 2.11.8, Java HotSpot(TM) 64-Bit Server VM, 1.8.0_202
Branch HEAD
Compiled by user jenkins on 2018-09-27T02:42:51Z
Revision 0ef0912caaab3f2636b98371eb29adb42978c595
Url git://github.mtv.cloudera.com/CDH/spark.git
Type --help for more information.

来自spark-shell你可以尝试这个来了解scala version

scala> util.Properties.versionString
res3: String = version 2.11.8

The OS可以使用其他scala version,就我而言,如你所见spark scala version and OS scala version是不同的

[cloudera@quickstart scala-programming-for-data-science]$ scala -version
Scala code runner version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.

Note 来自 O'Really Learning Spark “霍尔顿·卡劳、安迪·康文斯基、帕特里克·温德尔和马泰·扎哈里亚”

依赖冲突

一个偶尔具有破坏性的问题是处理dependency conflicts在情况下 用户应用程序和Spark本身都依赖于同一个库。这出现了 相对较少,但一旦发生,可能会让用户烦恼。通常,这会体现 本身当一个NoSuchMethodError, a ClassNotFoundException,或其他一些JVM exception在执行过程中抛出与类加载相关的异常Spark工作。 这个问题有两种解决方案。首先是将您的应用程序修改为 依赖于相同版本的third-party library that Spark做。第二个是 使用通常称为的过程修改应用程序的打包 “shading.” The Maven构建工具通过高级配置支持着色 例7-5所示的插件(事实上,shading能力就是插件的原因 被命名maven-shade-plugin). Shading允许您制作第二份副本 不同命名空间下的冲突包并重写应用程序的代码 使用重命名的版本。这有点brute-force技术非常有效 解析运行时dependency conflicts。有关如何操作的具体说明shade依赖项,请参阅构建工具的文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.NoSuchMethodError:Scala Spark 作业中的 scala.Predef$.refArrayOps 的相关文章

随机推荐