1.转换分为无状态转换和有状态转换。
取决于每个批次的处理是否依赖于之前批次的数据。
2.无状态转换:
1.概念:就是把简单的RDD操作应用在每个批次上,
也就是转换Dstream中的所有RDD。
2.算子:map()、reduceByKey()、filter()等
3.例子:
3.有状态转换:
1.概念:跨时间区间的跟踪数据的操作,
之前批次的数据也被用于在新的批次中计算结果。
2.有状态转换需checkpoint机制保证容错性。
ssc.checkpoint("hdfs://...")
3.算子:主要两种类型:
1.滑动窗口:以一个时间段为滑动窗口操作。
2.updateStateByKey():跟踪每个键的状态变化。
4.基于滑动窗口转换:
1.基于一个比SparkStreaming的批次更长的时间段(称为窗口)来计算其中的结果,
一个窗口包含多个批次。
2.需要两个参数:(都必须为批次的整数倍)
1.窗口时长(即窗口包含多个批次) slideInterval
2.滑动步长(即多长时间处理一次数据) windowLength
3.但当slideInterval > windowLength,
直接用reduceByKeyAndWindow(_+_,Seconds(3), Seconds(2))方法
会有重复计数,
如下图的time3,被重复计数。
解决办法:用reduceByKeyAndWindow的有逆函数的形式:
reduceByKeyAndWindow(_+_,_-_,Seconds(3s),seconds(2))
原来的计算结果是:(下图time1和time2间隔为1s)
win2 = time1 + time2+ time3
win3 = win2 + time3 + time4 + time5
后来用逆函数增量式:
(reduceByKeyAndWindow(_+_,_-_,Seconds(3s),seconds(2)))
win2 = time1 + time2+ time3
win3 = win2 + time4 + time5 - time2 - time1
可重用计算过的结果:win2前面算过直接拿来用。
好处:既节省计算又解决重复
5.基于updateStateByKey转换:
1.概念:通过一个键值对 DStream<key,事件>生成另一个键值对DStream<key,状态>,
传进来的数据经过事件处理后形成状态存储起来。
2.例如,
1.事件可能是对网站的访问,
2.键是用户ID,
3.状态是用户最近访问的10个页面列表。
用户不断点击就可以更新这个状态。
3.例子:跟踪各HTTP响应代码的计数
1.key:相应代码
2.events:页面访问
3.state:各响应代码的计数。
updateStateByKey()方法参数: