Spark Streaming-状态转换

本文详细探讨了流式处理中的无状态和有状态转换概念,包括map(), reduceByKey(), filter()等无状态转换算子,以及updateStateByKey()和滑动窗口等有状态转换算子。介绍了基于滑动窗口和updateStateByKey的转换机制,及其在容错性和计算效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值