01、前言
前面讲了时间 Time
的概念和实际解决问题后,本篇来看下经常搭配使用的另一个关键工具:窗口 Window
。
窗口也有三种类型可供选择使用:
Tumbling Windows:滚动窗口
Sliding Windows:滑动窗口
Session Windows:会话窗口
友情提示,本篇主要翻译自官网以及参考了 wuchong
大神的博客,内容比较干货,介绍这三种窗口的概念以及使用场景,希望看完能对 Flink
的窗口概念加深理解。
02、Window 窗口是什么
Windows
是处理无限流的核心。Windows
将流分成有限大小的“存储桶”,我们可以在其上应用计算。Flink
是一个优秀的流计算引擎,数据是源源不断的,它认为批处理 Batch
是一种特殊的流计算,在流中分割出一个个窗口,每个窗口相当于有限大小的空间,汇聚了待处理的数据。
窗口式 Flink
程序的一般结构如下所示。第一个片段指的是键控流,第二个片段指的是非键控流。可以看到,唯一的区别是对键控流的 keyBy(...)
调用和对非键控流的 window(...)
变为 windowAll(...)
。
Keyed Windows 键控流
stream
.keyBy(...) <- keyed versus non-keyed windows
.window(...) <- required: "assigner"
[.trigger(...)] <- optional: "trigger" (else default trigger)
[.evictor(...)] <- optional: "evictor" (else no evictor)
[.allowedLateness(...)] <- optional: "lateness" (else zero)
[.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data)
.reduce/aggregate/fold/apply() <- required: "function"
[.getSideOutput(...)] <- optional: "output tag"
Non-Keyed Windows 非键控流
stream
.windowAll(...) <- required: "assigner"
[.trigger(...)] <- optional: "trigger" (else default trigger)
[.evictor(...)] <- optional: "evictor" (else no evictor)
[.allowedLateness(...)] <- optional: "lateness" (else zero)
[.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data)
.reduce/aggregate/fold/apply() <- required: "function"
[.getSideOutput(...)] <- optional: "output tag"
03、Window 按驱动类型分类
上图按照不同驱动类型,将窗口分成三类。
时间驱动(Time Window,例如:每 10 秒钟)
数据驱动&