具体用法参考官网UpdateStateByKey Operation
updateStateByKey操作允许您在使用新信息不断更新时保持任意状态。 要使用它,您必须执行两个步骤。
- 定义状态 - 这个状态可以是任意的数据类型
- 定义状态update函数 - 用这个函数指定如何使用先前状态和新输入流里的新值更新状态
对于有状态操作,要不断的把当前和历史的时间切片的RDD累加计算,随着时间的流失,计算的数据规模会变得越来越大。
代码:
package com.soul.spark.Streaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* @author soulChun
* @create 2019-01-09-20:02
* * 统计目前出现的单词总次数
* * 1、将老数据存在某一个地方
* * 2、新建来的值和老数据进行状态更新
*/
object StatefulFunApp {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("StatafulFunApp").setMaster("local[2]")
val ssc = new StreamingContext(sparkConf,Seconds(10))
ssc.checkpoint("hdfs://localhost:8020/streamcheckpoint")
val lines = ssc.socketTextStream("localhost" , 8769)
val result = lines.flatMap( _.split(" ")).map((_,1))
val state = result.updateStateByKey[Int](updateFunction _)
state.print()
ssc.start()
ssc.awaitTermination()
}
def updateFunction(currentValues: Seq[Int], preValues: Option[Int]): Option[Int] = {
val current = currentValues.sum
val pre = preValues.getOrElse(0)
Some(current + pre)
}
}
会累计统计出单词出现的次数