sbt package
运行得很好,但在 spark-submit
之后我收到错误:
线程“main”中的异常java.lang.NoSuchMethodError:org.apache.spark.SparkContext $ .rddToPairRDDFunctions(Lorg / apache / spark / rdd / RDD; Lscala / reflect / ClassTag; Lscala / reflect / ClassTag; Lscala / math /排序;)Lorg /阿帕奇/火花/ RDD / PairRDDFunctions;在SmokeStack $ .main(SmokeStack.scala:46)位于sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Iv.:60)太阳的SmokeStack.main(SmokeStack.scala)位于org.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $的java.lang.reflect.Method.invoke(Method.java:498)中的.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在org.apache.spark.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:)org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:185)的SparkSubmit $$ runMain(SparkSubmit.scala:736) 210)org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:124)at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
这是违规行:
val sigCounts = rowData.map(row => (row("Signature"), 1)).countByKey()
rowData
是RDD Map [String,String] . "Signature"键存在于 Map 中的所有项目中 .
我怀疑这可能是一个构建问题 . 下面是我的sbt文件:
name := "Example1"
version := "0.1"
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.0"
scalacOptions ++= Seq("-feature")
我是Scala的新手所以也许进口不正确?我有:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import scala.io.Source
3 回答
java.lang.NoSuchMethodError
通常表明编译的代码版本的版本高于运行时使用的库版本 .使用Spark,这意味着用于编译的Spark版本与部署的版本(在计算机或集群上)不同 .
在开发和运行时之间对齐版本应该可以解决此问题 .
我在将简单的oneline json文件读入数据帧并使用.show()方法显示时遇到了同样的问题 . 我会在myDF.show()代码行中得到此错误 .
对我来说,结果是构建中的spark-sql库版本错误 .
即我从SBT进入我的外部图书馆,而不是 .
在build.sbt中添加以下行解决了这个问题
如果更新一个spark依赖项的版本,最安全的是将它们全部更新为相同的版本