抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >


Flink 中的三种 Window

Flink Window Demo 源码 GitHub

什么是 Window?

统计经过某红绿灯的汽车数量之和?

假设在一个红绿灯处,统计通过此红绿灯的汽车数量

可以把汽车的经过看成一个流,无穷的流,不断有汽车经过此红绿灯,因此无法统计总共的汽车数量。但是,我们可以换一种思路,每隔 15 秒,我们都将与上一次的结果进行 sum 操作(滑动聚合)

滑动聚合

这个结果似乎还是无法回答我们的问题,根本原因在于流是无界的,我们不能限制流,但可以在有一个有界的范围内处理无界的流数据。因此,我们需要换一个问题的提法:每分钟经过某红绿灯的汽车数量之和?

这个问题,就相当于一个定义了一个 Window(窗口),Window 的界限是 1 分钟,且每分钟内的数据互不干扰,因此也可以称为翻滚(不重合)窗口,如下图:

翻滚窗口

再考虑一种情况,每 30 秒统计一次过去 1 分钟的汽车数量之和

Window 出现了重合

此时,Window 出现了重合。这样,1 个小时内会有 120Window

  • Window 指定时间范围内的所有数据
  • 滚动窗口 各个窗口之间的数据不重叠(不重复)
  • 滑动窗口 各个窗口之间的数据重叠(重复)

Window 有什么作用?

通常来讲,Window 就是用来对一个无限的流设置一个有限的集合,在有界的数据集上进行操作的一种机制。Window 又可以分为基于时间(Time-based)的 Window 以及基于数量(Count-based)的 window

Flink 在 KeyedStream(DataStream 的继承类) 中提供了下面几种 Window:

  • 以时间驱动的 Time Window
  • 以事件数量驱动的 Count Window
  • 以会话间隔驱动的 Session Window

Time Window

  • 正如命名那样,Time Window 根据时间来聚合流数据。
  • 例如:一分钟的时间窗口就只会收集一分钟的数据,并在一分钟过后对窗口中的所有数据应用于下一个算子。
  • 在 Flink 中使用 Time Window 非常简单,输入一个时间参数,这个时间参数可以利用 Time 这个类来控制,如果事前没指定 TimeCharacteristic 类型的话,则默认使用的是 ProcessingTime

Time Window

dataStream.keyBy(1)
.timeWindow(Time.minutes(1)) //time Window 每分钟统计一次数量和
.sum(1);

Time Window

dataStream.keyBy(1)
.timeWindow(Time.minutes(1), Time.seconds(30)) //隔 30s 统计过去1m和
.sum(1);

Count Window

Apache Flink 还提供计数窗口功能,如果计数窗口的值设置的为 3 ,那么将会在窗口中收集 3 个事件,并在添加第 3 个事件时才会计算窗口中所有事件的值。

Count Window

dataStream.keyBy(1)
.countWindow(3) //统计每 3 个元素的数量之和
.sum(1);

Count Window

dataStream.keyBy(1) 
.countWindow(4, 3) //每隔 3 个元素统计过去 4 个元素的数量之和
.sum(1);

Session Window

Apache Flink 还提供了会话窗口,是什么意思呢?使用该窗口的时候你可以传入一个时间参数(表示某种数据维持的会话持续时长),如果超过这个时间,就代表着超出会话时长。

Session Window

dataStream.keyBy(1)
.window(ProcessingTimeSessionWindows.withGap(Time.seconds(5)))//表示如果 5s 内没出现数据则认为超出会话时长,然后计算这个窗口的和
.sum(1);
推荐阅读
Flink常用的算子 Flink常用的算子 Flink 时间语义 Flink 时间语义 Flink 概述 Flink 概述 Flink Flink Flink 编程模型 Flink 编程模型 Flink实时处理Socket数据 Flink实时处理Socket数据

留言区

Are You A Robot?