• +86-156-1535-0639
  • jianpengqi@126.com

count-based window wit time sliding interval

  • QI-Jianpeng

Window, Lag, WaterMark

http://storm.apache.org/releases/1.1.0/Windowing.html

1
2
withWindow(Count count, Duration timeInterval)
Tuple count based sliding window that slides after `slidingInterval` time duration.

这种方法count-based的窗口, 将窗口长度设置为count大小, 根据给定的时间戳, 每当划过timeInterval时间的时候, 对窗口中不是当前时间戳下的数据过期一部分, 为什么是一部分? 因为这是count-based, 要保证窗口内有count个tuple.

比如有e1(t1), e2(t1), e3(t2), e4(t2), e5(t3), 将count设置为3, timeInterval=1. 根据到达的数据:
窗口中的数据变化可能如下:

1
2
3
W1: e1, e2, e3
W2(W1+1): e2, e3, e4
W3(W2+1): e3, e4, e5

比如有种需求是每个时间戳下会有3个确定的tuple产生, 可能会考虑使用这种窗口, 你可能将count设置为3, 将timeInterval设置为1, 但单纯使用这种窗口是不能保障每个时间戳下的3个tuple被确切的接收到的. 因为有个能窗口内的3个tuple是由两个不同的时间戳下的数据组成的.

你可能会想到使用Lag方法来设置延迟, 然而这也没有用, 这是针对窗口数据的错乱程度. 根据他们的解释, lag代表的是窗口中接收到最新时间戳t的tuple后, 晚于t - lag的都会被当做迟到的数据, 默认不进行处理. 所以lag从某种程度上代表的是跟最近时间戳有关的指标.

你还可能说采用WaterMark怎么样, watermark = t - lag. watermark相当于告诉系统现在时间是t了了, 要处理我给你定的时间(也就是watermark)之前的数据了, 我之后(watermark+)的暂时先不要考虑处理.

两者结合呢? 如果说我lag设置为0(不接受任何混乱的数据), watermark时间间隔设置为1呢? 这代表了什么呢? 代表了当前窗口内当有最新时间t的数据到来时, 我不在接收t - lag之前的数据, 也不处理t之后的数据. 但是对于固定的tuple数量来说, 这里还是不能保证.

因此, Storm提供的Window相关的方法, 在这一方面是没有保证的, 需要我们自己实现相应的方法.
比如采用缓存机制, 对到达的数据暂存, 当该时间戳下的数据满足给定的数量后, 在进行后续的处理.