flink窗口分类

窗口分类

按照驱动类型分类

窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是“怎样截取数据”。换句话说,就是以什么标准来开发和结束数据的截取。
按照驱动类型分类主要分为两类:时间窗口与计数窗口
1、时间窗口
时间窗口以时间点来定义窗口的开始与结束,所以截取出的就是某一段时间的数据,窗口的时间范围都是左闭右开的原则[start,end);
2、计数窗口
计数窗口基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。
计数窗口相比时间窗口更加简单,我们只需要指定窗口大小,就可以把数据分配到对应的窗口当中,在flink内部也并没有对应的类来标识计数窗口,底层是通过“全局窗口”来实现的。

按照窗口分配数据的规则分类

时间窗口与计数窗口,只是对窗口的一个大致划分,在具体应用时,还需要定义更加精细的规则,来控制数据应该划分到哪个窗口中去,不同的分配数据的方式,就可以有不同的功能应用。
根据分配数据的规则,窗口的具体实现可以分为4类,滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)、会话窗口(Session Window)、全局窗口(Global Window)

  • 滚动窗口
    滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠,也不会有间隔,是首尾相接的状态。
    滚动窗口可以基于时间定义,也可以基于数据个数定义,需要的参数只有一个,就是窗口大小。
    滚动窗口的应用非常广泛,它可以对每个时间段做聚合统计,很多bi分析指标都可以用它来实现。

  • 滑动窗口
    与滚动窗口类似,滑动窗口的大小也是股东的。区别在于,窗口之间并不是首尾相接的,而是可以错开一定的位置。
    滑动窗口是固定大小窗口更广泛的一种形式,滚动窗口也可以看做是一种特殊的挂冬窗口-窗口大小等于步长(size = slide)
    在一些场景中,可能需要统计最近一段时间内的指标,而结果的输出频率要求又很高,甚至要求实时更新,比如股票价格24小时的涨跌幅统计,或者基于一段时间内行为检测异常报警,这是滑动窗口无疑就是很好的实现方式。

  • 会话窗口
    会话窗口,顾名思义,就是基于会话来对数据进行分组的。这里的会话类似web应用中的session的概念,不过并不标识两端的通讯过程,而是借用会话超时失效的机制来描述窗口。数据来了就开启一个会话窗口,如果超过指定时间没有收到数据,那么就认为会话失效,窗口自动关闭。
    与滑动窗口和滚动窗口不一样,会话窗口只能基于时间来定义。
    考虑到时间语义下的乱序流,相邻两个数据的时间间隔gap大于指定size的大小,被判定为两个窗口,上一个窗口就可以关闭,可在乱序数据的情况下,可能会有迟到数据,他的时间戳恰好在之前的两个数据之间的,这样一来,之前我们判断的间隔中就不是“一直没数据”,而合并之后的间隔有可能比size还小-标识这三个数据应该是同一个会话窗口。
    flink底层,对会话窗口的处理比较特殊:每来一个新数据,都会创建一个新的会话窗口,然后判断已有窗口之间的距离,如果小于给定的size,就对他们进行合并。在window算子中,对会话窗口会有单独的处理逻辑。
    对比之前的两种窗口,会话窗口的长度不固定,起始与结束时间也是不确定的,各个分区之间窗口没有任何关联。会话窗口一定是不会重叠的,而且会留下至少为size的间隔。

  • 全局窗口
    全局窗口是一类比较通用的窗口,这种窗口全局有效,会把相同key的所有数据都分配到同一个窗口中,就跟没有分窗口一样。无界流的数据永无止尽,所以这种窗口也没有结束的时候,默认是不会触发计算的,如果希望对数据进行计算处理,还需要自定义触发器。

窗口分配器

  • 时间窗口
    1、滚动处理时间窗口
    窗口分配器由TumblingProcessingTimeWindows提供,传入一个time类型的参数,标识滚动窗口的大小。
 stream.keyBy(...).window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
                .aggregate(...)

2、滑动处理时间窗口
窗口分配器由类SlidingProcessingTimeWindows提供,需要两个time类型的参数,size和slide,前者表示滑动窗口的大小,后者表示滑动窗口的步长。滚动窗口就是滑动窗口的特殊情形-size = slide

       stream.keyBy(...).window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5)))
                .aggregate(...)

3、处理时间会话窗口
窗口分配器由类ProcessingTimeSessionWindows提供,需要调用它的.withGap()方法或者.withDynamicGap(),
.withGap()方法需要传入一个time类型的参数size,表示会话的超时时间,也就是最小间隔session gap
.withDynamicGap()需要传入一个SessionWindowTimeGapExtractor作为参数,用来定义session gap的动态提取逻辑。

     stream.keyBy(...).window(ProcessingTimeSessionWindows.withGap())
                .aggregate(...)

4、滚动事件时间窗口
窗口分配器由类TumblingEventTimeWindows提供,用法与滚动处理事件窗口完全一致。


        stream.keyBy(...).window(TumblingEventTimeWindows.of(Time.seconds(5)))
                .aggregate(...)

5、滑动事件时间窗口
窗口分配器由类SlidingEventTimeWindows提供,用法与滑动处理事件窗口完全一致。

  stream.keyBy(...).window(SlidingEventTimeWindows.of(Time.seconds(10),Time.seconds(5)))
                .aggregate(...)

6、事件时间会话窗口
窗口分配器由EventTimeSessionWindows提供,用法与处理事件会话窗口完全一致。

      stream.keyBy(...).window(EventTimeSessionWindows.withGap(Time.seconds(10)))
                .aggregate(...)

窗口的生命周期

  • 窗口的创建
    窗口的类型和基本信息由窗口分配器(window assigners)指定,但窗口不会预先创建好,而是由数据驱动创建,当第一个应该属于该窗口的元素到达时,就会创建对应的窗口。
  • 窗口计算的触发
    每个窗口都会有自己的窗口函数和触发器,窗口函数可以分为增量聚合函数和全窗口函数,主要定义了窗口中计算的逻辑,而触发器则是指定调用窗口函数的条件。
  • 窗口的销毁
    一般情况下,当时间达到了结束点,就会触发计算输出结果、进而清楚状态销毁窗口,这时的窗口的销毁可以认为和触发计算是同一时刻。这里需要注意,flink中只对时间窗口(TimeWindow)有销毁机制,由于计数窗口(CountWindow)是基于全局窗口(GlobalWindow)实现的,全局窗口不会清除状态,所以就不会被销毁。
    在特殊场景下,窗口的销毁和触发计算会有所不同,事件时间语义下,如果设置了允许延迟,那么在水位线到达窗口结束时间时,仍然不会销毁窗口:窗口真正被完全删除的时间点,是窗口的结束时间加上用户指定的允许延迟时间。
posted @   clouderzheng  阅读(1220)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示