首页 > 代码库 > 基于storm的Window
基于storm的Window
Watermark作用
在解释storm的window之前先说明一下watermark原理。
Watermark中文翻译为水位线更为恰当。
顺序的数据从源头开始发送到到操作,中间过程肯定会出现数据乱序情况,比如网络原因,数据并发发送等。如何区分乱序的数据和正常的数据,就引申出了watermark。
Watermark是每一个时间窗口的下限,意思是说当watermark大于了窗口截止时间,那么该窗口就应该被关闭。而watermar也会随着时间窗口的变化不断更新自己。
参考下图,列举了几个关键的术语以及它们的定位。
概述
总体来看,抽象 tuple和watermark为Event,这样可以方便的把watermark注入到tuple。做统一化处理。
有5大组件组成
·WindowBoltExecutor
·WindowManager
·WaterMarkEventGenerator
·Trigger
·Eviction
WindowBoltExecutor负责整个window的初始化,参数配置和封装,
WindowManager负责存取数据,包括所有的数据操作
WaterMarkEventGenerator负责watermark的生成和维护
Trigger负责时间窗口的判断,决定是否触发窗口事件
Eviction负责数据状态的判断,得到数据是哪一种状态(KEEP,STOP,PROCESS,EXPIRED)
Watermark算法
所有流数据不一起处理,而是分开计算各个流最大时间,再根据最大时间集合计算出最小时间,这个时间就是watermark的时间。
这样做的目的是为了防止不同流传输的延迟不同,比方说,有2个上游A,B同时发数据,A由于网络较好,发送的数据比B快,导致了A的时间戳比B的大,如果watermark采用了全局最大值,那么时间窗口就会被提早关闭,而B发来的数据会被排除在该时间窗口
主逻辑流程
重要参数
英文 | 解释 |
windowLength | 窗口大小 |
slidingInterval | 窗口滑动步长 |
windowEndTs | 窗口截止时间 |
watermark | 水位线,判断是否关闭时间窗口的标志 |
maxLag | 时间窗口的最大延迟时间(网络等问题造成) |
eventTimestamp | 数据时间,每个数据都有自带的时间戳 |
数据4种状态
状态 | 解释 |
KEEP | 当前窗口不处理。是未来窗口的数据 |
STOP | 停止处理,数据时间戳比窗口截止时间+lag还大,说明不属于该窗口,之后的数据也不属于 |
PROCESS | 当前窗口内的数据 |
EXPIRE | 过期数据,需要被移除 当 窗口截止时间 – 数据时间 > 窗口大小 |
基于storm的Window