【无标题】窗口的分类

介绍

在Flink中,窗口的应用非常
灵活,我们可以使用各种不同类型的窗口来实现需求。接下来我们就从不同的角度,对Flink
中内置的窗口做一个分类说明。

1. 按照驱动类型分类

窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息其实就是“怎样截取
数据”。换句话说,就是以什么标准来开始和结束数据的截取,我们把它叫作窗口的“驱动类
型”。
我们最容易想到的就是按照时间段去截取数据,这种窗口就叫作“时间窗口”(Time
Window)。这在实际应用中最常见,之前所举的例子也都是时间窗口。除了由时间驱动之外,
窗口其实也可以由数据驱动,也就是说按照固定的个数,来截取一段数据集,这种窗口叫作“计
数窗口”(Count Window),如图所示。
在这里插入图片描述

(1)时间窗口(Time Window)

时间窗口以时间点来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间
段的数据。到达结束时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁。
用结束时间减去开始时间,得到这段时间的长度,就是窗口的大小(window size)。这里
的时间可以是不同的语义,所以我们可以定义处理时间窗口和事件时间窗口。
Flink 中有一个专门的类来表示时间窗口,名称就叫作 TimeWindow。这个类只有两个私
有属性:start和end,表示窗口的开始和结束的时间戳,单位为毫秒。

private final long start; 
private final long end; 

我们可以调用公有的getStart()和getEnd()方法直接获取这两个时间戳。另外,TimeWindow
还提供了一个maxTimestamp()方法,用来获取窗口中能够包含数据的最大时间戳。

我们可以调用公有的getStart()和getEnd()方法直接获取这两个时间戳。另外,TimeWindow
还提供了一个maxTimestamp()方法,用来获取窗口中能够包含数据的最大时间戳。

很明显,窗口中的数据,最大允许的时间戳就是end - 1,这也就代表了我们定义的窗口
时间范围都是左闭右开的区间[start,end)。

(2)计数窗口(Count Window)

计数窗口基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。每个窗
口截取数据的个数,就是窗口的大小。
计数窗口相比时间窗口就更加简单,我们只需指定窗口大小,就可以把数据分配到对应的
窗口中了。在Flink内部也并没有对应的类来表示计数窗口,底层是通过“全局窗口”(Global
Window)来实现的。

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

时间窗口和计数窗口,只是对窗口的一个大致划分;在具体应用时,还需要定义更加精细
的规则,来控制数据应该划分到哪个窗口中去。不同的分配数据的方式,就可以有不同的功能
应用。
根据分配数据的规则,窗口的具体实现可以分为4类:滚动窗口(Tumbling Window)、
滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)。
(1)滚动窗口(Tumbling Windows)
滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠,
也不会有间隔,是“首尾相接”的状态。如果我们把多个窗口的创建,看作一个窗口的运动,
那就好像它在不停地向前“翻滚”一样。这是最简单的窗口形式,我们之前所举的例子都是滚
动窗口。
滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口
的大小(window size)。比如我们可以定义一个长度为1小时的滚动时间窗口,那么每个小时
就会进行一次统计;或者定义一个长度为10的滚动计数窗口,就会每10个数进行一次统计。
在这里插入图片描述
滚动窗口应用非常广泛,它可以对每个时间段做聚合统计,很多BI分析指标都可以用它
来实现。

(2)滑动窗口(Sliding Windows)

与滚动窗口类似,滑动窗口的大小也是固定的。区别在于,窗口之间并不是首尾相接的,
而是可以“错开”一定的位置。如果看作一个窗口的运动,那么就像是向前小步“滑动”一样。
既然是向前滑动,那么每一步滑多远,就也是可以控制的。所以定义滑动窗口的参数有两
个:除去窗口大小(window size)之外,还有一个“滑动步长”(window slide),它其实就代
表了窗口计算的频率。同样,滑动窗口可以基于时间定义,也可以基于数据个数定义。
在这里插入图片描述
我们可以看到,当滑动步长小于窗口大小时,滑动窗口就会出现重叠,这时数据也可能会
94
被同时分配到多个窗口中。而具体的个数,就由窗口大小和滑动步长的比值(size/slide)来决
定。所以,滑动窗口其实是固定大小窗口的更广义的一种形式。
在一些场景中,可能需要统计最近一段时间内的指标,而结果的输出频率要求又很高,甚
至要求实时更新,比如股票价格的24小时涨跌幅统计,或者基于一段时间内行为检测的异常
报警。这时滑动窗口无疑就是很好的实现方式。

(3)会话窗口(Session Windows)

会话窗口顾名思义,是基于“会话”(session)来来对数据进行分组的。这里的会话类似
Web 应用中session 的概念,不过并不表示两端的通讯过程,而是借用会话超时失效的机制来
描述窗口。
与滑动窗口和滚动窗口不同,会话窗口只能基于时间来定义。对于会话窗口而言,最重要
的参数就是会话超时时间的长度(size),也就是两个会话窗口之间的最小距离。如果相邻两
个数据到来的时间间隔(Gap)小于指定的大小(size),那说明还在保持会话,它们就属于同
一个窗口;如果gap大于size,那么新来的数据就应该属于新的会话窗口,而前一个窗口就应
该关闭了。在具体实现上,我们可以设置静态固定的大小(size),也可以通过一个自定义的
提取器(gap extractor)动态提取最小间隔gap的值。
在这里插入图片描述
在一些类似保持会话的场景下,往往可以使用会话窗口来进行数据的处理统计。

(4)全局窗口(Global Windows)

还有一类比较通用的窗口,就是“全局窗口”。这种窗口全局有效,会把相同key的所有
数据都分配到同一个窗口中。无界流的数据永无止尽,所以这种窗口也没有结束的时候,默认
是不会做触发计算的。如果希望它能对数据进行计算处理,还需要自定义“触发器”(Trigger)。
在这里插入图片描述

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值