Spark Streaming-状态转换

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()方法参数:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41227335/article/details/86562330
今日推荐