Spark Streaming进阶
带状态的算子
updateStateByKey算子的使用
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Created by llp on 2021/4/27.
*/
object StatefulWordCount2 {
def main(args: Array[String]): Unit = {
// 1.创建StreamingContext
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("WordCount")
val ssc = new StreamingContext(sparkConf,Seconds(5))
// 2.创建checkpoint
// 如果要使用updateStateByKey算子,就必须设置一个checkpoint目录,开启checkpoint机制
// 这样的话才能把每个key对应的state除了在内存中有,那么是不是也要checkpoint一份
// 因为你要长期保存一份key的state的话,那么spark streaming是要求必须用checkpoint的,以便于在
// 内存数据丢失的时候,可以从checkpoint中恢复数据
// 开启checkpoint机制,很简单,只要调用jssc的checkpoint()方法,设置一个hdfs目录即可
// https://blog.csdn.net/erfucun/article/details/52278729
ssc.checkpoint("/opt/data")
// 实现WordCount逻辑
val lines = ssc.socketTextStream("hadoop2", 9999)
//val lines = ssc.textFileStream("/opt/data")
val result = lines.flatMap(_.split(" ")).map((_,1)).updateStateByKey((values:Seq[Int],state:Option[Int])=>{
//更新函数两个参数Seq[V], Option[S],前者是每个key新增的值的集合,后者是当前保存的状态,
//创建一个变量,用于记录单词出现次数
var newValue=state.getOrElse(0) //getOrElse相当于if....else.....
for(value <- values){
newValue +=value //将单词出现次数累计相加
}
Option(newValue)
})
result.print()
ssc.start()
ssc.awaitTermination()
}
}