1、啥是Window?Window有啥作用?
Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。Flink 提供了非常完善的窗口机制,这是Flink 最大的亮点之一(其他的亮点包括消息乱序处理,和 checkpoint 机制)。
Window是一种切割无限数据集为有限块并进行相应计算的处理手段(跟keyBy一样,也是一种分组手段,只不过同一event可能被分到多个组)
在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。
2、Flink Window大分类
2.1、Keyed Windows(在已经按照key分组的基础上(KeyedStream),再构建多任务并行window)
2.2、Non-Keyed Windows(在未分组的DataStream上构建单任务window,并行度是1,API都带All后缀)
2.3、Keyed Windows vs Non-Keyed Windows(以基于time的window为例)
3、Window的生命周期
3.1、创建:当属于该窗口的第一个元素到达时就会创建该窗口
3.2、销毁:当时间(event/process time)超过窗口的结束时间戳+用户指定的延迟时(allowedLateness(<time>)),窗口将被移除(仅限time-based window)
例如:对于一个每5分钟创建Tumbling Windows(即翻滚窗口)窗口,允许1分钟的时延,Flink将会在12:00到12:05这段时间内第一个元素到达时创建窗口,当watermark超过12:06时,该窗口将被移除。
3.2、Trigger(触发器)
指定了窗口函数在什么条件下可被触发,触发器还可以决定在创建和删除窗口之间的任何时间清除窗口的内容。在这种情况下,清除仅限于窗口中的元素,而不是窗口元数据。这意味
着新数据仍然可以添加到该窗口中。
例如:当窗口中的元素个数超过4个时― 或者 ‖当水印达到窗口的边界时―触发计算
3.3、Window的函数
函数里定义了应用于窗口(Window)内容的计算逻辑
3.4、Evictor(驱逐者)
将在触发器触发之后或者在函数被应用前后,清除窗口中的元素
4、Window Assinger是干啥的
当你决定stream是否keyby之后,window是没有构建的,你还需要指定一个window Assinger用于定义元素如何分配到窗口中。
window Assinger如何指定?
Keyedstream:window(WindowAssigner)
non-keyed streams :windowAll(WindowAssigner)
window Assinger的作用:负责将每个传入的元素分配给一个或多个窗口