当我在Intellij中编译和运行代码时,一切都很顺利。问题在我将.jar作为spark作业(运行时)提交时出现。在主线程中发生异常: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(Native Method) 中 在 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) 中
第62行包含:
for ((elem, i) <- args.zipWithIndex)
。我注释了其余的代码以确保,但是错误仍然显示在那行上。起初,我认为是
zipWithIndex
的问题。然后我将其更改为for (elem <- args)
,猜猜发生了什么,错误仍然显示。是否是for
引起的呢?Google搜索总是指向编译使用的Scala版本与运行时使用的版本不兼容,但我无法找到解决方法。
我尝试了this以检查IntelliJ使用的Scala版本,并且在Modules> Scala 下列出了所有与Scala相关的内容:
然后我执行了this,以检查Scala的运行时版本,输出结果如下:
(file:/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
任务)
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下载页面中,只有一个Scala 2.12的Spark发行版,并且没有Hadoop;这是否意味着我必须将gradle.build中的Scala版本从2.12降级到2.11?
compile
关键字来指定Scala版本,参考这里:https://dev59.com/EaLia4cB1Zd3GeqPhVV9 - Boris Azanov