updateStateByKey,noClassDefFoundError

时间:2015-05-25 10:30:45

标签: scala apache-spark sbt spark-streaming sbt-assembly

我在使用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 _)

我觉得这可能是一些兼容性版本问题,但我不知道可能是什么原因以及如何解决这个问题。

我真的很感激你的帮助!

2 个答案:

答案 0 :(得分:1)

当您在SBT中编写"provided"时,这意味着您的库完全由环境提供,并且不需要包含在包中。 尝试从"provided"库中删除"spark-streaming"标记。

答案 1 :(得分:0)

当您需要将应用程序提交到要运行的spark群集时,可以添加“已提供”。具有“提供”的好处是结果胖jar将不包括来自所提供的依赖项的类,与没有“提供”相比,这将产生更小的胖罐。在我的情况下,结果jar将在没有“提供”的情况下大约90M,然后用“提供”缩小到30 + M。