实时数据开发 | 一文理解Flink窗口机制
窗口操作在流处理和批处理之间起到了桥梁的作用。
Flink引擎本质上是流式引擎,认为批处理是流处理的一个特例。因此,通过窗口将流数据划分为有限大小的集合,使得在这些有界的数据集上可以进行批处理风格的计算。
通过配置窗口的参数,如长度和滑动间隔,可以精确地控制数据的聚合和计算频率,以满足各种业务需求。
组件
Flink的窗口操作内部实际上包含了三个组件来描述和定义一个窗口:WindowAssigner、Trigger和Evictor。
- Window Assigner 用来决定某个元素被分配到哪个/哪些窗口中去;
- Trigger(触发器)决定了一个窗口何时能够被计算或清除,每个窗口都会拥有一个自己的 Trigger ;
- Evictor(驱逐者)则在 Trigger 触发之后,并且在窗口被处理之前,剔除窗口中不需要的元素,其相当于一个过滤器。
类型:时间&数量
Flink支持两种主要类型的窗口:基于时间的窗口和基于数量的窗口。
- 基于时间的窗口:这种窗口根据时间戳将数据流划分为不同的时间段。
选择合适的窗口类型对于处理无限数据流和实现有效的实时分析至关重要。在Flink中,可以根据数据特性和业务需求选择不同的窗口类型:- 滚动窗口:适合处理周期性的任务。是固定时间长度的窗口,不重叠地依次划分数据流。例如,每五分钟计算一次数据的平均值。
- 滑动窗口:用于需要更频繁更新结果的场景。滑动窗口有固定的长度和滑动间隔,允许窗口重叠,从而提供更细粒度的实时数据更新。例如,每五分钟滑动一次的十分钟窗口,可以每五分钟更新前十分钟的数据分析。
- 会话窗口:适合用于用户会话等不固定长度的窗口,自动根据空闲(或不活动)时间来划分窗口。这对于分析用户行为的非连续活动非常有效。
- 基于数量的窗口:这种窗口依据流入元素的数量来划分数据。例如,每当接收到一定数量的数据元素后,就生成一个窗口进行处理。
在实际应用中,选择窗口时需考虑以下几点:
- 数据的性质:是否有固定的时间间隔或需要实时更新。
- 业务需求:是否需要精细的时间粒度及对结果的更新频率。
- 性能影响:窗口的大小和类型会对系统的性能和资源消耗产生影响。
生命周期
从窗口生命周期来讲,只有当属于此窗口的第一个元素到达后,才会创建此窗口,当窗口结束时间到的时候(如果指定了窗口的允许延迟时间,还要加上此延迟时间),窗口被完全删除。窗口生命周期管理确保了流数据的有序处理,并在合适的时间点执行计算,使流处理高效且可预测。
Flink保证仅移除基于时间的窗口,而不移除其他类型(例如全局窗口等)。例如,某job 使用基于事件时间的窗口操作,假定使用5min 的翻滚窗口,并且允许延迟lmimn延迟,那么Flink将在 12:00 和12:05 之间并且当落人此间隔时间戳的第一个元素到达时创建此窗口,并将在watermark超过12:06 时将其删除。