代码改变世界

完整教程:flink批处理-时间和窗口

2025-10-03 20:43  tlnshuju  阅读(4)  评论(0)    收藏  举报

流处理:流处理是对连续产生的实时数据进行即时处理的技巧,内容以事件流的形式逐条(flink)或按小批次(spark)处理,无需等待完整素材集就绪。
批处理对静态数据集按固定批次(如每小时/每天)进行离线处理的手艺,遵循“先存储后处理”模式。就是:批处理
有界流:有界流:具有明确的开始和结束点(如静态材料、数据库表)。有界流处理通常被称为批处理。
无界流:只有开始点,数据持续产生无终止(如Kafka消息流、IoT传感器数据)。

所谓的窗口计算。flink通过这种方式,实现数据的批处理。就是flink通过划定一段时间范围(时间窗),对在这范围内的数据进行处理,就
窗口和时间往往是分不开的,所以需要了解flink中的时间语义和窗口的概念。

流处理的核心组件,其设计原理和应用方式如下:就是Flink的时间语义和窗口机制

一、时间语义

1.事件时间(Event Time)‌

数据产生时自带的时间戳,需配合水位线(Watermark)处理乱序事件,适用于需要精确时间戳的场景

2.处理时间(Processing Time)‌

算子本地系统时间,延迟低但结果不可重现,适用于实时性要求高的场景

3.摄入时间(Ingestion Time)‌

资料进入Flink Source的时间。

二、窗口类型

1. 按驱动方式

‌时间窗口‌:基于时间范围划分,包括滚动、滑动、会话三种子类型。
‌计数窗口‌:基于材料条数划分,与时间无关。

2. 按分配规则

类型特点示例场景
滚动窗口固定长度、无重叠(如每小时统计)日活用户统计
滑动窗口固定长度、可重叠(如每5分钟统计近1小时)实时监控报警
会话窗口动态间隙触发(用户无管理后关闭)用户行为分析
全局窗口需自定义触发器(如批处理)全量聚合计算

三、关键机制

‌1.水位线(Watermark)

用于处理事件时间乱序。

2.窗口函数

增量聚合(ReduceFunction)
全量计算(ProcessWindowFunction)

3.迟到数据处理

通过侧输出流(Side Output)或允许延迟(Allowed Lateness)保障结果准确性

// 事件时间滑动窗口
dataStream
  .assignTimestampsAndWatermarks(WatermarkStrategy
    .forBoundedOutOfOrderness(Duration.ofSeconds(5)))
  .keyBy(Event::getUserId)
  .window(SlidingEventTimeWindows.of(Time.seconds(30), Time.seconds(5)))
  .aggregate(new CustomAggregate());