有状态转换和无状态转换的区别
- Spark Streaming中,如果该操作可以同时对不同批次的数据进行处理,就是有状态转换。如果该操作只能对每个批次中的数据依次进行处理,不同批次之间的数据不进行运算,就是无状态转换。
updateStateByKey的功能
- 对相同的key继续聚合,updateStateByKey可以跨批次处理数据,可以聚合之前周期的所有数据。比如累加wordcount。
代码
- 状态信息保存在checkpoint目录中,需要指定checkpoint目录。
- 聚合后需要更新状态信息。
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]")
val ssc = new StreamingContext(conf,Seconds(3))
ssc.checkpoint("D:\\develop\\workspace\\bigdata2021\\spark2021\\checkpoint")
val dataDStream: ReceiverInputDStream[String] = ssc.socketTextStream("hadoop01", 8888)
val mapDStream: DStream[(String, Int)] = dataDStream.flatMap(_.split(" ")).map((_,1))
val resDStream: DStream[(String, Int)] = mapDStream.updateStateByKey(
(seq: Seq[Int], state: Option[Int]) => {
val count: Int = seq.sum + state.getOrElse(0)
Option(count)
}
)
resDStream.print()
ssc.start()
ssc.awaitTermination()
}