//updateStateByKey状态一直持续,即累加之前所有的RDD的结果
object WordCountUpdateStateByKey {
def main(args: Array[String]): Unit = {
System.setProperty("hadoop.home.dir", "E:\\software\\bigdate\\hadoop-2.6.0-cdh5.15.0\\hadoop-2.6.0-cdh5.15.0")
val conf= new SparkConf();
//spark配置
//指明运行方式 local本地,local[2]开启2个线程
conf.setMaster("local[2]")//一个线程用于读数据,一个用于处理数据
conf.setAppName("WordCountStreaming")//在yarn资源管理器监控
val sc= new SparkContext(conf);
//StreamingContext 是SparkStreaming驱动
val streamingContext= new StreamingContext(sc,Seconds(5))
//确定输入源
//单纯统计 输入源 监听网络端口
val sourceDS= streamingContext.socketTextStream("wangfutai",7777)
//streamingContext.checkpoint("hdfs://wangfutai:9000//home//wangfutai//a//sparkcheck")
streamingContext.checkpoint("E:\\sparkdata")
//单词统计
//sourceDS支持绝大多数的算子
//注意:每个batch,只处理当前时间RDD
sourceDS.
flatMap(
line=>{
line.split(" ")
}
).map((_,1))
.updateStateByKey(
(values:Seq[Int],state:Option[Int])=>{
//values 封装本次RDD中的value,state是上一个RDD聚合的结果
var newvalue= state.getOrElse(0)
for(tmp <- values){
newvalue +=tmp
}
Option(newvalue)
})
.print()
//开启spark streaming任务
streamingContext.start()
//需要等待任务执行
//当调用这个函数,整个任务会在后台不停运行
streamingContext.awaitTermination()
}
}