概念
状态更新指的是从socket中接收的数据做WordCount后得到的结果能对历史结果进行累加的一种操作。
batch:指的是一个批次的数据
updateFn:用于对最新数据与历史数据进行操作的函数
案例
编写代码监听node1节点中的9999端口,并对端口中拉取到的单词进行wordcount
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object WordCountDemo2_状态管理 {
def main(args: Array[String]): Unit = {
//TODO 0.准备环境
val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
sc.setLogLevel("WARN")
//创建StreamingContext
val streamingContext = new StreamingContext(sc, Seconds(5))
//创建检查点
streamingContext.checkpoint("checkpoint")
// TODO 1.加载数据
val lines: ReceiverInputDStream[String] = streamingContext.socketTextStream("node1", 9999)
// TODO 2.处理数据
// 2.1定义一个用于最新数据和历史数据进行累加的函数
val updateFunction=(currentValues:Seq[Int],histroryValue:Option[Int]) =>{
if (currentValues.size>0){
val result = currentValues.sum+histroryValue.getOrElse(0)
Some(result)
}else{
histroryValue
}
}
val result: DStream[(String, Int)] = lines.flatMap(_.split("\\s+")).map((_, 1)).updateStateByKey(updateFunction)
//TODO 3.输出结果
result.print()
//TODO 4.启动并等待结束
streamingContext.start()
streamingContext.awaitTermination()//注意:流式应用程序启动之后需要一直运行等待手动停止/等待数据到来
//TODO 5.关闭资源
streamingContext.stop(stopSparkContext = true, stopGracefully = true)//优雅关闭
}
}