Keyed与Non-Keyed Windows
Flink根据DataStream在窗口之前是否进行keyBy操作将窗口分为keyed窗口和Non-keyeds窗口,所以这两种窗口的定义就非常明了:
- Keyed Windows:在keyBy()流中上应用窗口操作。使用window()操作,下游操作可以多个并行度,即每个分组都有自己的单独窗口,窗口逻辑可以在多个Task下执行。
- Non-Keyed Windows:在非keyBy()流上进行窗口操作,只能使用windowAll()操作,下游操作并行度只能为1,即所有的窗口逻辑只能在一个Task上执行。
Flink的窗口应用程序代码结果顺序如下:
// Keyed Window
stream
.keyBy(...) <- 按照一个Key进行分组
.window(...) <- 将数据流中的元素分配到相应的窗口中,下游操作可以是多个并行度。
[.trigger(...)] <- 指定触发器Trigger(可选)
[.evictor(...)] <- 指定清除器Evictor(可选)
.reduce/aggregate/process() <- 窗口处理函数Window Function
// Non-Keyed Window
stream
.windowAll(...) <- 不分组,将数据流中的所有元素分配到相应的窗口中,下游操作只能是一个并行度。
[.trigger(...)] <- 指定触发器Trigger(可选)
[.evictor(...)] <- 指定清除器Evictor(可选)
.reduce/aggregate/process() <- 窗口处理函数Window Function
根据上述窗口程序代码结果可知,trigger(触发器),evictor(清除器)都是可选项,所以Flink窗口程序必须包含两部分:
- window…(): 窗口,即窗口分配器(WindowAssigner),用于将数据流中的元素分配到对应的窗口。
- reduce/aggregate/process(): 窗口处理函数,当满足窗口触发条件后,对窗口内的数据使用窗口处理函数(Window Function) 进行处理,常用的Window Function有
reduce,aggregate,process。
Window Assigners(分配器)
WindowAssigner负责将每个传入的元素分配给一个或多个窗口。Flink提供丰富窗口类型及相应的内置窗口分配器,如下:
- 滚动窗口分配器:适用于滚动窗口
- 滑动窗口分配器:适用于滑动窗口
- 会话窗口分配器:适用于会话窗口
- 全局窗口分配器:适用于全局窗口
- 自定义窗口分配器:你也可以通过扩展WindowAssigner类来实现一个自定义窗口分配器。
所有内置的窗口分配器(全局窗口除外)都根据时间将元素赋值给窗口,时间可以是处理时间,也可以是事件时间和摄入时间。
基于时间的窗口有一个窗口开始时间戳(包含)和一个窗口结束时间戳(不包含),即窗口区间为左包右不包,它们一起描述了窗口的大小。在代码中,Flink在处理基于时间的窗口时使用TimeWindow,该窗口支持三种时间戳获取: - 获取窗口开始时间戳
- 获取窗口结束时间戳
- 还有一个额外获取窗口允许的最大时间戳.max.Timestamp()方法
719

被折叠的 条评论
为什么被折叠?



