Flink水位线与窗口类型详解
请详细解释Flink中水位线(Watermark)的机制,以及Tumble/Session/Sliding三种窗口类型的特点和适用场景。
回答
Yahuda
一、水位线(Watermark):
作用: 解决事件时间乱序问题,表示【在此时间戳之前的数据已经全部到达】
生成策略:
// 固定延迟
env.getConfig().setAutoWatermarkInterval(200);
DataStream<Event> stream = env
.assignTimestampsAndWatermarks(
WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(10))
.withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
工作原理:
- Watermark = MaxEventTimestamp - AllowedLateness
- 当Watermark ≥ 窗口结束时间,触发窗口计算
- 多个分区的Watermark取最小值(全局对齐)
二、窗口类型:
1. Tumble Window(滚动窗口):
-- 5分钟滚动窗口
SELECT window_start, window_end, COUNT(*)
FROM TABLE(TUMBLE(TABLE events, DESCRIPTOR(ts), INTERVAL '5' MINUTE))
GROUP BY window_start, window_end;
- 固定大小,不重叠
- 每个事件属于一个窗口
- 适用:每分钟PV统计
2. Sliding Window(滑动窗口):
-- 10分钟窗口,每5分钟滑动
SELECT ... FROM TABLE(HOP(TABLE events, DESCRIPTOR(ts), INTERVAL '5' MINUTE, INTERVAL '10' MINUTE))
- 固定大小,固定滑动步长,会重叠
- 每个事件属于多个窗口
- 适用:最近10分钟的实时趋势(步长决定更新频率)
**3. Session Window(会话窗口):
-- 间隔5分钟不活动关闭窗口
SELECT ... FROM TABLE(SESSION(TABLE events, DESCRIPTOR(ts), INTERVAL '5' MINUTE))
- 按活动间隙分组,大小不固定
- 两个事件间隔超过gap则关闭窗口
- 适用:用户行为会话分析(电商/游戏)
选择建议:
- 固定周期统计 → Tumble
- 平滑滚动趋势 → Sliding
- 用户行为分组 → Session