类似SparkStreaming这种流式计算,但我们处理无限数据集已经由 批处理转向到流处理,而window 是一种切割无限数据为有限块进行处理的。
Window 是无线数据流处理的核心, Window 将一个无限的 stream 拆分成有限大小的 "buckets" 桶, 可以在这些桶上进行操作计算。
Window 类型
Window 可以分成两类:
- CountWindow:按照指定的数据条数生成一个 Window, 与时间无关。
- TimeWindow: 按照时间生成 Window。
对于 TimeWindow, 可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window) 和 会话窗口 (Session Window)
- 滚动窗口(Tumbling Windows)
将数据依据固定的窗口长度对数据进行切片。
特点:时间对齐, 窗口长度固定,没有重叠。
滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,滚动窗口由一个固定的大小,并不会出现重叠。
- 滑动窗口(Sliding Windows)
滑动窗口是固定窗口的更广义的一种形式,滑动窗口是由固定的窗口长度和 滑动间隔组成。
特点:时间对齐,窗口长度固定,可以有重叠。
- 会话窗口(Session Windows)
由一系列事件组合一个指定时间长度的 timeout 间隙组成。 类似于 Web 应用的 session。也就是一段时间没有接收到新数据就会生成新的窗口。
特点:时间无对齐。
Window API
- 窗口分配器 ----- window() 方法
- 我们可以用.window() 来定义一个窗口,然后基于这个 window去做一些聚合或者其它 处理操作。注意 window() 方法必须在 keyBy之后才能用。
- Flink 提供了更加简单的 .timeWindow 和 .countWindow 方法, 用于定义时间窗口和计数窗口。
窗口分配器(window assigner)
- Window() 方法接收的输入参数是一个 WindowAssigner
- WindowAssigner 负责将每条输入的数据分发到正确的 window 中
- Flink 提供了 通用的 WindowAssigner
> 滚动窗口 (tumbling window)
> 滑动窗口 (sliding window)
> 会话窗口 (session window)
> 全局窗口 (global window)
创建不同类型的窗口
- 滚动事件窗口(tumbling time window)
.timeWindow(Time.seconds(15))
-
滑动时间窗口(sliding time window)
.timeWindow(Time.seconds(15),Time.seconds(5))
-
会话窗口(session window)
.window(EventTimeSessionWindows.withGap(Time.minutes(10)))
-
滚动计数窗口(tumbling count window)
.countWindow(5)
-
滚动计数窗口(sliding count window)
.countWindow(10,2)
窗口函数(window function)
- window function 定义了要对窗口中收集的数据做的计算操作
- 可以分为两类
> 增量聚合函数 (incremental aggregation functions)
> 每条数据到来就进行计算,保持一个简单的状态
> ReduceFunction, AggregateFunction
> 全窗口函数 (full window functions)
> 先把窗口所有数据收集起来,等到计算的时候会遍历所有数据
> ProcessWindowFunction, WindowFunction
其他可选API
- .tigger() ----- 触发器
定义 window 什么时候关闭, 触发计算并输出结果 - .evitor() ----- 移除器
定义移除某些数据的逻辑 - .allowedLateness() ------ 允许迟到的数据
- .sideOutputLateData() ------ 将迟到的数据放入侧输出流
- .getSideOutput() ------ 获取侧输出流