说明:本文为《Flink大数据项目实战》学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程:
Flink大数据项目实战:http://t.cn/EJtKcD1
1.Window是啥
1.1啥是Window?有啥作用?
Flink认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。Flink 提供了非常完善的窗口机制,这是Flink 最大的亮点之一(其他的亮点包括消息乱序处理,和 checkpoint 机制)。
Window是一种切割无限数据集为有限块并进行相应计算的处理手段(跟keyBy一样,也是一种分组手段,只不过同一event可能被分到多个组)。
在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。
1.2Window分类(是否kyBy决定了大分类)
Keyed Windows(在已经按照key分组的基础上(KeyedStream),再构建多任务并行window)。
Non-Keyed Windows(在未分组的DataStream上构建单任务window,并行度是1,API都带All后缀)
1.3Keyed Windows vs Non-Keyed Windows(以基于time的window为例)
1.4Window的生命周期
创建:当属于该窗口的第一个元素到达时就会创建该窗口
销毁:当时间(event/process time)超过窗口的结束时间戳+用户指定的延迟时(allowedLateness(<time>)),窗口将被移除(仅限time-based window)
例如:对于一个每5分钟创建Tumbling Windows(即翻滚窗口)窗口,允许1分钟的时延,Flink将会在12:00到12:05这段时间内第一个元素到达时创建窗口,当watermark超过12:06时,该窗口将被移除
Trigger(触发器):指定了窗口函数在什么条件下可被触发,触发器还可以决定在创建和删除窗口之间的任何时间清除窗口的内容。在这种情况下,清除仅限于窗口中的元素,而不是窗口元数据。这意味着新数据仍然可以添加到该窗口中。
例如:当窗口中的元素个数超过4个时“ 或者 ”当水印达到窗口的边界时“触发计算。
Window的函数:函数里定义了应用于窗口(Window)内容的计算逻辑。
Evictor(驱逐者):将在触发器触发之后或者在函数被应用前后,清除窗口中的元素。
2.窗口分配器(Window Assingers)
2.1Window Assinger是干啥的
当你决定stream是否keyby之后,window是没有构建的,你还需要指定一个window Assinger用于定义元素如何分配到窗口中。
window Assinger如何指定?
1.Keyedstream:window(WindowAssigner)
2.non-keyed streams:windowAll(WindowAssigner)
window Assinger的作用:负责将每个传入的元素分配给一个或多个窗口。
2.2Window小分类(Window Assinger类型)
有了window Assinger,才会创建出各种形式的window来覆盖我们所需的各种场景,所以不用过多关注window本身的分类,关注window Assinger的分类即可。
Count-based window:根据元素个数对数据流进行分组切片
1.Tumbling CountWindow
2.Sliding CountWindow
Time-based window :根据时间对数据流进行分组切片
1.Tumbling Window
2.Sliding Window
3.Session Window
注意:Time-based window [start,end)
Times
2.3Tumbling Windows-翻滚窗口
定义:将数据依据固定的窗口长度对数据进行切片。
特点:
1.时间对齐
2.窗口长度固定
3.event无重叠
适用场景:BI统计(计算各个时间段的指标)。
对齐方式:默认是aligned with epoch(整点、整分、整秒等),可以通过offset参数改变对齐方式。
2.4Sliding Windows-滑动窗口
定义:是固定窗口的更广义的一种形式。滑动窗口由固定的窗口长度和滑动间隔组成。
特点:
1.时间对齐
2.窗口长度固定
3.event有重叠
适用场景:监控场景,对最近一个时间段内的统计(求某接口最近5min的失败率来决定是否要报警)。
对齐方式:默认是aligned with epoch(整点、整分、整秒等),可以通过offset参数改变对齐方式。
2.5Session Windows
定义:类似于web应用 的session,即一段时间没有接受到新数据就会生成新的窗口(固定gap/gap fun)。
特点:
1.时间无对齐
2.event不重叠
3.没有固定开始和结束时间
适用场景:线上用户行为分析。
Gap
1.固定gap
2.动态gap:实现SessionWindowTimeGapExtractor
特殊处理方式
1.session window operator为每个到达的event创建一个新窗口,如果它们之间的距离比定义的间隔更近,则将窗口合并在一起。
2.为了能够合并, session window operator需要合并触发器和合并窗口函数,例如ReduceFunction、AggregateFunction或ProcessWindowFunction
(FoldFunction不能合并)。
2.6Global Windows
定义:有相同key的所有元素分配给相同的单个全局窗口,必须指定自定义触发器否则没有任何意义。
注意:不要跟Non-keyed Window搞混,两个不同的角度。
使用方式:
2.7所有窗口盘点
2.8预定义Keyed Windows
Tumbling time window
.timeWindow(Time.seconds(30))
Sliding time window
.timeWindow(Time.seconds(30), Time.seconds(10))
Tumbling count window
.countWindow(1000)
Sliding count window
.countWindow(1000, 10)
Session window
.window(SessionWindows.withGap(Time.minutes(10)))
2.9预定义Non-Keyed Windows
Tumbling time window
.timeWindowAll(Time.seconds(30))
Sliding time window
.timeWindowAll(Time.seconds(30), Time.seconds(10))
Tumbling count window
.countWindowAll(1000)
Sliding count window
.countWindowAll(1000, 10)
Session window
.window(SessionWindows.withGap(Time.minutes(10)))