flink批处理-时间和窗口
流处理:流处理是对连续产生的实时数据进行即时处理的技术,数据以事件流的形式逐条(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.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5))).keyBy(Event::getUserId).window(SlidingEventTimeWindows.of(Time.seconds(30), Time.seconds(5))).aggregate(new CustomAggregate());