dstream的两种类型

来源:互联网 发布:苹果cms定时规则 编辑:程序博客网 时间:2024/05/16 01:45

dstream的两种模式,一种是有状态,一种无状态

无状态就是说每批次的处理不依赖于之前批次的数据,如map,filter,reducebykey等,都是无状态转化操作。场景,例如汇总sum类操作

相对的有状态操作就是依赖之前的批次,包括滑动窗口的转化操作和追踪状态变化的转化操作。

场景是:滑动窗口,去重类操作,比如每次数据批次过来,我需要基于历史的去重,有状态占用的存储会多一些

有状态操作:主要有两种类型,滑动窗口和updatestatebykey

滑动窗口:近10分钟最热帖子的排行,或近10分钟销售量计算。

场景:实时计算当天销售额,它的开始结束时间点是确定的,所以它不是滑动窗口。

使用updatestatebykey(),key代表维度,如果按天计算销售额,key就是日期,如果按天,地区计算销售额,key就是date+地区

updatestatebykey也就是在如果key代表日期,就是说每次更新的时候就按照日期去更新它的值。

updatestatebykey用的更多一些。滑动窗口是一个时间段滑动操作,后者则是根据每个key进行跟踪的。

有状态操作需要在你的streamingcontext中打开检查点机制来确保容错性,设置检查点ssc.checkpoint("hdfs://..."),也可以使用本地路径(如/tmp)取代hdfs,就是用来存储数据的中间结果的。

api:streamingcontext。

对kafka来讲,数据生产和数据消费通常是两个不同职责的部门,数据生产是负责业务系统开发的部门,数据消费是数据加工的部门。

reducebykeyandwindows(_+_,_-_,minutes(10),seconds(2),2)//表明时间窗口是10分钟,没两秒钟更新一次。

kafkautils.createstream方式消费的简单代码格式如下:

===
val Array(zkQuorum, group, topics, numThreads) = args

val sparkConf = new SparkConf().setAppName("kafkaWordCount")

val ssc = new StreamingContext(sparkConf, Seconds(2))

ssc.checkpoint("checkpoint")

val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap

val lines = KafkaUtil.createStream(ssc, zkQuorum, group, topicMap).map(_._2)

val words = lines.flatMap(_.split(" "))

val wordCounts = words.map(x =>(x,1L)).reduceByKeyAndWindows(_+_,_-_,Minutes(10),Seconds(2),2)

wordCounts.print()

ssc.start()

ssc.awaitTermination()

===




0 0
原创粉丝点击