java.lang.nosuchmethoderror:scala的spark作业中的scala.predef$.refarrayops

wbrvyc0a  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(419)

完全错误:
线程“main”java.lang.nosuchmethoderror中出现异常:scala.predef$.refarrayops([ljava/lang/object;)[ljava/lang/object;在org.spark\u module.sparkmodule$.main(sparkmodule。scala:62)位于org.spark_module.sparkmodule.main(sparkmodule.scala)的sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)的sun.reflect.nativemethodaccessorimpl.invoke(本机方法)。java:62)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43) 在java.lang.reflect.method.invoke(方法。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.com)。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版本在编译时使用的版本和运行时使用的版本之间不兼容,但我找不出解决方案。
我试着检查intellij使用的scala版本,下面是modules>scala下与scala相关的所有内容:

然后我检查了scala的运行时版本,结果是:
(文件:/c:/users/me/.gradle/caches/modules-2/files-2.1/org.scala-lang/scala-library/2.12.11/1a0634714a956c1aae9abec83acaf6d4eabfa7d/scala-library-2.12.11.jar)
版本似乎匹配。。。
这是我的gradle.build(包括 fatJar 任务)

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'

}

要构建(fat)jar:

gradlew fatJar

在intellij的终端。
要运行作业:

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

在windows powershell中。
谢谢您
编辑:
spark-submit.cmd和spark-shell.cmd都显示scala版本2.11.12,所以是的,它们与我在intellij(2.12.11)中使用的版本不同。问题是,在spark的下载页面中,Scala2.12只有一个spark发行版,而且没有hadoop;这是否意味着我的gradle.build必须从2.12降到2.11?

thigvfpy

thigvfpy1#

我会努力的 spark-submit --version 想知道什么 scala version 正在使用 sparkspark-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

这个 `OS` 可能是用其他的 `scala version` ,在我的情况下,你可以看到 `spark scala version` 以及 `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.

o'really learning spark“霍尔顿·卡劳、安迪·孔温斯基、帕特里克·温德尔和马特·扎哈里亚”的笔记
从属冲突
一个偶尔会引起混乱的问题是处理 `dependency conflicts` 如果用户应用程序 `Spark` 两者都依赖于同一个库。这种情况很少出现,但一旦出现,可能会让用户感到烦恼。通常,当 `NoSuchMethodError` ,一个 `ClassNotFoundException` ,或者其他的 `JVM exception` 在执行 `Spark` 工作。这个问题有两种解决办法。第一种方法是修改应用程序,使其依赖于同一版本的 `third-party library` 那个 `Spark` 做。第二种方法是使用通常称为“着色”的过程来修改应用程序的打包 `Maven` 构建工具通过示例7-5中所示插件的高级配置来支持着色(实际上,着色功能是插件命名的原因) `maven-shade-plugin` ). 着色允许您在不同的命名空间下创建冲突包的第二个副本,并重写应用程序的代码以使用重命名的版本。这有点 `brute-force` 该技术在解决运行时问题时非常有效 `dependency conflicts` . 有关如何隐藏依赖项的具体说明,请参阅构建工具的文档。

相关问题