Flink中的Window

Flink中的Window

在上一篇博客中我们提到了一个需求:每隔1秒计算一次5秒内的温度传感器的最大值。这用前面介绍的知识似乎很难解决。但是,学习了Window之后,分分钟解决它。

那么,现在我们来一起认识一下Window吧。

Window

window就是窗户,但是我认为叫它水龙头更合适一些。这是由它的作用决定的。Flink DataStream认为所有的数据都是流式的,我们可以把数据想象成水流,而window的功能就是截取一段水流放入桶“buckets”中。概括来说Window就是一种将无限数据切分成有限块进行处理的过程。

Window类型

Window分为两类,分别是TimeWindow和CountWindow,而TimeWindow又分为滚动窗口、滑动窗口、会话窗口。

  1. TimeWindow(时间窗口):按照时间生成Window

    • 滚动窗口(Tumbling Windows):

Flink中的Window

由图中我们可以看到,每个窗口都是紧挨着但是又不想交。每个窗口的时间集合都是左闭右开的例如:

[09:00,09:15),[09:15,09:30)。

  • 滑动窗口(Sliding Windows):

Flink中的Window

与滚动窗口不同,滑动窗口除了有固定的的长度之外,它们是可以相互重叠的。这个重叠范围是通过参数slide决定的。重叠范围=size-slide。当然滑动窗口的时间范围也是左闭右开的。

现在再来看看我们上边提到的需求,不就是时间范围是5秒滑动步长是1秒的滑动窗口吗?是不是很简单?!那么问题来了,如果数据因为网络延迟等情况迟到了呢?这就用到了时间语义了。这个咱们以后再聊。

  • 会话窗口(Session Windows):

Flink中的Window

与前两种时间窗口不同,会话窗口并没有固定的长度。它是需要指定一个session gap时间段,当一次数据传输在这段时间内一直没有数据,那么窗口就会关闭。会话窗口非常适合处理用户行为数据。即从用户访问网站时开始直到用户离开网站或长时间不操作时结束。中间客户所有的动作数据可以在一个窗口中处理。

  1. CountWindow(计数窗口):按数据的条数生成一个窗口,与时间无关。

    计数窗口比较简单,就是窗口累计数据量达到一定的数量就会关闭,直到下一条数据到来再开启下一个窗口。