我在使用updateStateByKey()函数时遇到问题。我有以下简单的代码(基于书的书写:“学习Spark - 照明快速数据分析”):
object hello {
def updateStateFunction(newValues: Seq[Int], runningCount: Option[Int]): Option[Int] = {
Some(runningCount.getOrElse(0) + newValues.size)
}
def main(args: Array[String]) {
val conf = new SparkConf().setMaster("local[5]").setAppName("AndrzejApp")
val ssc = new StreamingContext(conf, Seconds(4))
ssc.checkpoint("/")
val lines7 = ssc.socketTextStream("localhost", 9997)
val keyValueLine7 = lines7.map(line => (line.split(" ")(0), line.split(" ")(1).toInt))
val statefullStream = keyValueLine7.updateStateByKey(updateStateFunction _)
ssc.start()
ssc.awaitTermination()
}
}
我的build.sbt是:
name := "stream-correlator-spark"
version := "1.0"
scalaVersion := "2.11.4"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.3.1" % "provided",
"org.apache.spark" %% "spark-streaming" % "1.3.1" % "provided"
)
当我使用sbt assembly
命令构建它时,一切都很顺利。当我在本地模式下在spark集群上运行它时,我收到错误:
线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / spark / streaming / dstream / DStream $ at hello $ .main(helo.scala:25) ...
第25行是:
val statefullStream = keyValueLine7.updateStateByKey(updateStateFunction _)
我觉得这可能是一些兼容性版本问题,但我不知道可能是什么原因以及如何解决这个问题。
我真的很感激你的帮助!
答案 0 :(得分:1)
当您在SBT中编写"provided"
时,这意味着您的库完全由环境提供,并且不需要包含在包中。
尝试从"provided"
库中删除"spark-streaming"
标记。
答案 1 :(得分:0)
当您需要将应用程序提交到要运行的spark群集时,可以添加“已提供”。具有“提供”的好处是结果胖jar将不包括来自所提供的依赖项的类,与没有“提供”相比,这将产生更小的胖罐。在我的情况下,结果jar将在没有“提供”的情况下大约90M,然后用“提供”缩小到30 + M。