11.Flink窗口的分类

1 Flink的Window可以分成两类:

1.Flink窗口的分类"1.Flink窗口的分类"GlobalWindow:按照指定的数据条数生成一个Window,与时间无关。

TimeWindow:按照时间生成Window,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。1.Flink窗口的分类"

  • 滚动窗口(Tumbling Windows)
将数据依据固定的窗口⻓度对数据进行切片特点时间对⻬,窗口⻓度固定,没有重叠
1.Flink窗口的分类"

滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,滚动窗口有一个固定的大小,并且不会     出现重叠。例如:如果你指定了一个5分钟大小的滚动窗口,窗口的创建如下图所示:

  • 滑动窗口(Sliding Windows)
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口⻓度和滑动间隔组成。    特点:时间对⻬,窗口⻓度固定,有重叠。
1.Flink窗口的分类"

滑动窗口分配器将元素分配到固定⻓度的窗口中,与滚动窗口类似,窗口的大小由窗口大小参数来配置,另一个窗口滑动参数控制滑动窗口开始的频率。因此,滑动窗口如果滑动参数小于窗口大小的话,窗口是可以重叠的,在这种情况下元素会被分配到多个窗口中。

  • 会话窗口(Session Windows)
由一系列事件组合一个指定时间⻓度的timeout间隙组成,类似于web应用的session,也就是一段时间没有接收到新数据就会生成新的窗口
1.Flink窗口的分类"

特点时间无对⻬

session窗口分配器通过session活动来对元素进行分组,session窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况,相反,当它在一个固定的时间周期内不再收到元素,即     非活动间隔产生,那个这个窗口就会关闭。一个session窗口通过一个session间隔来配置,这个session间隔定义了非活跃周期的⻓度,当这个非活跃周期产生,那么当前的session将关闭并且后续的元素将被分配到新的session窗口中去。

2 Non-Keyed和Keyed Windows

在划分Window之前,首先要确定该DataStream是否调用了key算子将数据按照key进行分组了。如果没有调用keyBy算子,可以调用windowAll方法的返回一个AllWindowedStream,这种window叫做Non-Keyed Windows(未分组的Widnows);如果事先已经调用了keyBy算子,即对KeyedStream可以调用window方法返回一个WindowedStream,这种window叫做Keyed Windows(分组的Widnows)。由于调用windowAll/window算子后会生成会生成新WindowedStream/WindowedStream,所以窗口算也是属于Transformation。

2.1 Non-Keyed Windows

未分组的Widonws,即DataSteam直接调用windowAll算子得到的Windows,Non-Keyed Windows的特点是,在某一个具体的窗口,所有的数据都会被窗口算子路由到一个subtask中进行运算,如果并行度大于1,下一次生成的window的数据会被路由到其他的subtask中进行运算。

下面是Non-Keyed Windows的方法调用顺序和方法说明:

stream.windowAll(…)                             //<-  必选方法: 指定相应的窗口分配器       
[.trigger(…)]                             //<-  可选方法: 指定触发器,如果不指定有默认的触发器       
[.evictor(…)]                             //<-  可选方法: 指定剔除器,如果不指定有默认的剔除器       
[.allowedLateness(…)]                   //<-  可选方法: 指定延迟触发时间,如果不指定,默认为0       
[.sideOutputLateData(…)]                //<-  可选方法: 指定延迟数据的侧流输出的Tag        
.sum/reduce/aggregate/fold/apply()     //<-  必选方法: 指定窗口函数       
[.getSideOutput(…)]                      //<-  可选方法: 指定侧流数据的Tag

windowAll():划分Non-Keyed Windows,参数为指定的Window Assinger。

trigger():指定触发器,如果不指定有默认的触发器。

evictor():指定剔除器,如果不指定有默认的剔除器。

allowedLateness():指定延迟触发时间,如果不指定,默认为0。

sideOutputLateData():指定延迟数据的侧流输出的tag,用来筛选出打上指定tag的迟到数据

sum/reduce/aggregate/fold/apply()指定窗口函数,窗口触发时会应该改函数对窗口中的数据进行计算。

getSideOutput():指定侧流数据的tag,筛选出指定tag类型的数据。

1.1.2 Keyed Windows

分组的Widonws,即KeyedStream直接调用window算子得到的Windows。Keyed Windows

的特点是:窗口中的数据会根据key进行分组,key相同的数据一定会被分到同一个组内,并被路由到同一个subtask中,一个key对应一个组,一个subtask中可以有零到多个组。窗口触发会对每个组进行计算,每个组都会得到一个结果。

下面是Keyed Windows的方法调用顺序和方法说明:

stream.keyKey(…)     //<-  先对DataStream调用keyBy得到keyedStream
.window(…)                                 //<-  必选方法: 指定相应的窗口分配器       
[.trigger(…)]                             //<-  可选方法: 指定触发器,如果不指定有默认的触发器       
[.evictor(…)]                             //<-  可选方法: 指定剔除器,如果不指定有默认的剔除器       
[.allowedLateness(…)]                   //<-  可选方法: 指定延迟触发时间,如果不指定,默认为0       
[.sideOutputLateData(…)]                //<-  可选方法: 指定延迟数据的测流输出的Tag        
.sum/reduce/aggregate/fold/apply()     //<-  必选方法: 指定窗口函数       
[.getSideOutput(…)]                      //<-  可选方法: 指定测流数据的Tag

keyBy():按照key进行分组,参数为一或多个分组字段

windw():划分keyed Windows,参数为指定的Window Assinger

星哥原创,未经许可,不得转载

wx