一、窗口到底是什么?(最核心概念)
1. 一句话定义
窗口 = 把无限流 → 切割成有限的数据块(桶),方便计算。
2. 正确理解(面试必说)
- 窗口不是固定的框
- 窗口是动态创建的桶
- 数据来了 → 分到对应窗口 → 时间 / 数量到了 → 计算输出
- 窗口区间:左闭右开 [start, end)
3. 窗口的意义
Flink 是流式计算,数据无限,必须用窗口变成有限数据才能统计。
二、窗口两大分类(必考)
1. 按 驱动类型 分
(1)时间窗口(TimeWindow)
- 按时间切割
- 到点就触发计算
- 最常用
(2)计数窗口(CountWindow)
- 按数据个数切割
- 凑够数量就触发
- 底层 = 全局窗口
2. 按 数据分配规则 分(4 种)
- **滚动窗口(Tumbling)**不重叠、无间隙
- **滑动窗口(Sliding)**可重叠、有步长
- **会话窗口(Session)**隔一段时间没数据就断开
- **全局窗口(Global)**所有数据进同一个窗口(需自定义触发器)
三、窗口 API 最核心结构
流
.keyBy(...) // 分组(必须,否则并行度=1)
.window(...) // 窗口分配器(定义窗口类型)
.aggregate(...) // 窗口函数(计算逻辑)
四、Keyed vs Non-Keyed 窗口(超级重要)
1. Keyed Window(推荐 ✅)
- 先
.keyBy() - 多并行度执行
- 每个 key 独立窗口、独立状态
- 支持定时器、状态、窗口
2. Non-Keyed Window(不推荐 ❌)
- 直接
.windowAll() - 并行度永远 = 1
- 性能极差
- 生产几乎不用
五、窗口分配器(Window Assigners)
1. 时间窗口(最常用)
滚动窗口
.window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
滑动窗口
.window(SlidingProcessingTimeWindows.of(大小, 步长))
会话窗口
.window(ProcessingTimeSessionWindows.withGap(Time.seconds(10)))
2. 计数窗口
滚动计数
.countWindow(10) // 10条数据触发
滑动计数
.countWindow(10, 3) // 窗口10条,每3条滑动一次
六、窗口函数(Window Functions)(必考)
两大类:
1. 增量聚合函数(性能高 ✅)
来一条算一条,不存全部数据
- ReduceFunction输入、输出类型必须一样
- AggregateFunction (最强大)支持:
- 输入类型
- 中间累加器类型
- 输出类型三者可不一样!
AggregateFunction 4 个方法:
createAccumulator()创建累加器add()数据来了就加getResult()窗口结束输出结果merge()会话窗口合并用
2. 全窗口函数(功能强 ✅)
先缓存所有数据,窗口结束一起算
- WindowFunction(老版,不推荐)
- ProcessWindowFunction(新版,最强大)
能拿到:
- 窗口全部数据
- 窗口开始 / 结束时间
- 上下文、状态、时间
七、窗口高级 API(面试高频)
1. 允许延迟(allowedLateness)
.allowedLateness(Time.minutes(1))
- 窗口到时间后不关闭
- 再等 1 分钟,迟到数据仍可进入计算
2. 迟到数据 → 侧输出流(SideOutput)
.sideOutputLateData(lateTag)
- 彻底迟到的数据 → 打入侧输出流
- 不影响主流
- 可单独处理、补算
八、本章 10 个最强结论(背会直接过面试)
- 窗口 = 把无限流切成有限块进行计算
- 窗口是动态桶,不是固定框
- keyBy 之后开窗才支持多并行、状态、定时器
- 窗口分:时间窗口、计数窗口
- 分配规则:滚动、滑动、会话、全局
- 增量聚合性能高,全窗口功能全
- AggregateFunction 是最灵活的增量聚合
- ProcessWindowFunction 功能最强大
- 事件时间必须处理迟到数据
- 迟到处理:允许延迟 + 侧输出流
九、面试满分回答(直接背)
Flink 窗口是将无界流切割成有界数据块的核心机制,分为时间窗口和计数窗口,按分配规则可分为滚动、滑动、会话和全局窗口。窗口必须在 keyBy 之后使用才能支持高并行、状态和定时器。窗口计算分为增量聚合(Reduce/Aggregate)和全窗口函数(ProcessWindowFunction),前者性能高,后者功能全。事件时间下需通过 allowedLateness 和侧输出流处理迟到数据,保证计算准确。