9阅网

您现在的位置是:首页 > 知识 > 正文

知识

scala - java.lang.NoSuchMethodError: scala.Predef$.refArrayOps in Spark job with Scala

admin2022-11-07知识17

完整的错误。

在线程 "main "中出现异常 java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([LjavalangObject;)[LjavalangObject;在org.spark_module.SparkModule$.main(SparkModule.scala:62) 在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:845) at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161) at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit. scala:184) at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86) at org.apache.spark.deploy.SparkSubmit$anon$2.doSubmit(SparkSubmit. scala:920) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

当我在IntelliJ中编译并运行代码时,它一直执行得很好。当我将.jar作为spark作业(运行时)提交时,就会出现错误。

第62行包含: for ((elem, i) <- args.zipWithIndex). 我注释了其余的代码以确定,但错误一直显示在这一行。

起初我以为是 zipWithIndex'的错。然后我把它改成 for (elem <- args) 你猜怎么着,错误还是显示出来了。是 for 导致这种情况的原因是什么?

谷歌搜索总是指向Scala的编译版本和运行时的版本不兼容,但我想不出解决办法。

我试过 这个 来检查IntelliJ使用的Scala版本,这里是所有与Scala相关的东西,在 模块> Scala:

enter image description here

然后,我做了 这个 来检查Scala的运行时版本,输出结果是。

(file:C:Usersme.gradlecachesmodules-2files-2.1org.scala-langscala-library2.12.111a0634714a956c1aae9abefc83acaf6d4eabfa7dscala-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'

}

要建立(胖)罐子。

gradlew fatJar

在IntelliJ的终端上

要运行该作业。

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

在Windows PowerShell中

谢谢您

EDIT:

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



【回答】:

我可以尝试spark-submit --version来了解使用spark的scala版本。

使用spark-submit --version,我得到的信息如下

[[email protected] 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的版本。

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

操作系统可以使用其他的scala版本,在我的例子中,你可以看到spark scala版本和OS scala版本是不同的。

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

来自欧真的学习火花 "Holden Karau,Andy Konwinski,Patrick Wendell &amp;Matei Zaharia"

依赖性冲突一个偶尔出现的破坏性问题是处理用户应用程序和Spark本身都依赖同一个库的情况下的依赖性冲突。这种情况很少出现,但是一旦出现,就会让用户感到困扰。通常情况下,在执行Spark作业的过程中,会出现NoSuchMethodError,ClassNotFoundException,或者其他与类加载有关的JVM异常。第一种是修改你的应用程序,使其依赖与Spark相同版本的第三方库。第二种是使用一个通常被称为 "着色 "的过程来修改你的应用程序的包装。Maven构建工具通过对例7-5所示插件的高级配置来支持着色功能(事实上,着色功能就是该插件被命名为maven-shade-plugin的原因)。着色功能允许你在不同的命名空间下制作第二个冲突包的副本,并重写你的应用程序的代码以使用重命名的版本。这种有点粗暴的技术在解决运行时依赖冲突方面非常有效。关于如何进行着色依赖的具体说明,请参见你的构建工具的文档。

希望能对你有所帮助,谢谢。