CodeWalk

Flink水位线与窗口类型详解

作者:Yahuda · 2026-05-30 12:55

请详细解释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