Watermark作用
在解释storm的window之前先说明一下watermark原理。
Watermark中文翻译为水位线更为恰当。
顺序的数据从源头开始发送到到操作,中间过程肯定会出现数据乱序情况,比如网络原因,数据并发发送等。如何区分乱序的数据和正常的数据,就引申出了watermark。
Watermark是每一个时间窗口的下限,意思是说当watermark大于了窗口截止时间,那么该窗口就应该被关闭。而watermar也会随着时间窗口的变化不断更新自己。
参考下图,列举了几个关键的术语以及它们的定位。
watermark可以理解为自定义的可以代表整个流的时间点,并且会不断更新。一般情况,当watermark-lastWindowEndTs>slidingInterval,那么就会触发一个新的窗口。
lag可以理解为自定义的最大数据延迟时间范围,由于实时计算对实时性的需求,而数据在网络波动等情况下不是按顺序到达计算,所以lag的出现就是为了解决那些能到达的数据但是时间比正常数据晚的情况,当该数据的时间小于watermark-lag。那么就判定该数据为延迟数据,可以选择直接丢弃或者其他自定义操作。
概述
总体来看,抽象 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 | 过期数据,需要被移除 当 窗口截止时间 – 数据时间 > 窗口大小 |