首页 > 代码库 > 基于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