一步一个脚印,一天一道大数据面试题。
时间形式:
- Ingestion time 摄入时间: 进入到 Flink 系统时的时间,比如刚被 Flink 读取时候的时间
- Process time 处理时间:在 Flink 算子触发,开始处理时的时间,在处理时的系统时间
- Event time 事件时间:每个传入的数据里往往有自己的时间数据,一般代表该数据的发生时间
目前做的更多用的是 Event time 事件时间,处理的数据里一般带有这个时间的字段。
窗口形式:
- Tumbling Window 滚动窗口:通过固定窗口大小(时间,或数据量)来对数据进行划分,数据不会重叠
- Sliding Window 滑动窗口:滑动窗口有固定窗口大小,但有窗口大小,滑动步长两个设置。滑动步长代表的是计算频率。如果滑动步长<窗口大小,就会产生重叠。(可以参考贴的尚硅谷的图)
- Session Window 会话窗口:数据如果超过了一定时间没来,就划分一个窗口,数据不会重叠
- Global Window 全局窗口: 这个窗口是没有结束的时候,正常是不会计算的。需要搭配触发器
代码样例:
我觉得来点代码样例会更舒服,这些代码来自尚硅谷。
// 滚动事件时间窗口
stream.keyBy(...)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.aggregate(...)
// 滑动事件时间窗口
stream.keyBy(...)
.window(SlidingEventTimeWindows.of(Time.seconds(10),Time.seconds(5)))
.aggregate(...)
// 会话事件时间窗口
stream.keyBy(...)
.window(EventTimeSessionWindows.withGap(Time.seconds(10)))
.aggregate(...)
// 全局窗口
stream.keyBy(...)
.window(GlobalWindows.create())
.aggregate(...)
一般用的 Tumbling Window 滚动窗口多一点。
备注
窗口分为是否按键分区,也就是是否使用 keyBy()
,如果不是按键分区,并行度只有1,手动调大并行度也没用。所以这个得注意。