当前位置: 首页 > 知识库问答 >
问题:

java.lang.NosuchMethodError:Scala.predef$.RefArrayOps在Spark作业中使用Scala

司徒焕
2023-03-14

完全错误:

线程“main”java.lang.nosuchmethoderror:scala.predef$.refarrayops([ljava/lang/object;)[ljava/lang/object;)[ljava/lang/object;;在org.spark_module.sparkmodule$.main(sparkmodule.scala:62)在org.spark_module.sparkmodule.scala.main(sparkmodule.scala)在sun.reflect.nativemethodaccessorimpl.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)在.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),猜怎么着,仍然显示错误。是否是的导致的?

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

版本似乎匹配...

这是我的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
spark-submit.cmd .\SparkModule-1.0-SNAPSHOT.jar

spark-submit.cmd和spark-shell.cmd都显示了Scala版本2.11.12,所以是的,它们不同于我在IntelliJ(2.12.11)中使用的版本。问题是,在Spark的下载页面中,只有一个Scala2.12的Spark发行版,而且没有Hadoop;这是否意味着我必须从2.12降级到2.11在我的分级。构建?


共有1个答案

吕嘉荣
2023-03-14

我将尝试spark-submit--version以了解Scala version使用的spark

通过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版本

scala> util.Properties.versionString
res3: String = version 2.11.8
[cloudera@quickstart scala-programming-for-data-science]$ scala -version
Scala code runner version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.

依赖冲突

在用户应用程序和spark本身都依赖于同一个库的情况下,处理dependency冲突是一个偶尔具有破坏性的问题。这种情况相对较少出现,但当它出现时,它可能会让用户感到烦恼。通常,在执行Spark作业期间引发与类加载相关的NosuchMethoderRorClassNotFoundException或其他JVM异常时,这种情况就会显现出来。这个问题有两种解决办法。首先是修改应用程序,使其依赖于Spark所使用的第三方库的相同版本。第二种方法是使用通常称为“shading”的过程修改应用程序的打包。Maven构建工具通过示例7-5所示的插件的高级配置来支持shading(实际上,shading功能正是插件被命名为Maven-shade-plugin)的原因。着色允许您在不同的命名空间下创建冲突包的第二个副本,并重写应用程序的代码以使用重命名的版本。这种有点brute-force的技术在解决运行时dependency冲突时非常有效。有关如何隐藏依赖项的具体说明,请参见生成工具的文档。

 类似资料:
  • 我试图运行火花作业,基本上加载数据在卡桑德拉表。但它也产生了以下错误。

  • 我对Spark很陌生,目前正在通过玩pyspark和Spark-Shell来探索它。 现在的情况是,我用pyspark和Spark-Shell运行相同的spark作业。 这是来自Pyspark: 使用spark-shell,工作在25分钟内完成,使用pyspark大约55分钟。如何让Spark独立地用pyspark分配任务,就像它用Spark-shell分配任务一样?

  • 问题内容: 它说,在Apache Spark文档中,“ 在每个Spark应用程序中,如果多个“作业”(Spark操作)是由不同的线程提交的,则它们可以同时运行 ”。有人可以为以下示例代码解释如何实现此并发吗? 这两个作业是独立的,必须同时运行。 谢谢。 问题答案: 尝试这样的事情:

  • 我使用了以下格式的输入数据: 我已经使用以下代码段使用多线程将RDD保存为文本文件: 在本例中,我遇到了以下例外情况

  • 18:02:55,271错误UTILS:91-中止任务java.lang.nullpointerException在org.apache.spark.sql.catalyst.expressions.generatedClass$GeneratedIterator.agg_doAggregateWithKeys$(未知源)在org.apache.spark.sql.catalyst.express

  • 我计划使用Spark来处理数据,其中RDD或数据帧中的每个单独元素/行有时可能很大(高达几GB)。 数据可能会存储在HDFS中的Avro文件中。 显然,每个执行程序都必须有足够的RAM来在内存中保存这些“胖行”中的一个,并留出一些。 但是,Spark/HDFS或常见序列化格式(Avro、拼花、序列文件…)的行大小是否有其他限制?例如,这些格式中的单个条目/行能否比HDFS块大小大得多? 我知道HB