storm-starter中的RollingTopWords代码解析

源码来自storm-starter。RollingTopWords的作者对代码的实现做了非常详细的解释,请看这里

这篇博文用于记录我自己在查看代码时的理解。

Spout部分略过不提。用的是TestWordSpout。

1. RollingCountBolt

带有两个参数windowLengthInSeconds和emitFrequencyInSeconds。前者表示滑动窗口所有slot的总时间,后者表示每个slot的时间。前者除以后者表示slot的个数。

同时,使用SlidingWindowCounter类来模拟滑动窗口,参数是窗口个数(windowLengthInSeconds除以emitFrequencyInSeconds表示slot的个数)。

SlidingWindowCounter类又是通过成员变量SlotBasedCounter类实现滑动窗口计数。方法incrementCount在当前slot中将当前obj对象个数加1。方法getCountsThenAdvanceWindow方法返回当前一个map,内容为所有对象以及其对应的计数和。

下图说明的是SlotBasedCounter的工作原理,SlidingwindowCounter在使用它时,会指定一个headSlot,这样某一个时刻,所有的obj的计数都会写入某个下标相同的slot里。

storm-starter中的RollingTopWords代码解析_第1张图片

SlotBasedConter实际上是维护一个Map<T, long[]> objToCounts对象。

下图说明的是SlidingWindowCounter如何维护一个对象的计数。

storm-starter中的RollingTopWords代码解析_第2张图片

每一个被统计的对象都有如上图这样一个SlotBasedCounter对象进行统计。

2. IntermediateRankingsBolt

该类继承自抽象类AbstractRankerBolt(继承自BaseBasicBolt)。维护了一个topN大小的Rankings对象。Rankings类实际上是维护一个List<Rankable>的更新查找等操作。

在execute方式执行时,如果来的是TickTuple,则用emitRankings方法发送Rankings结果;如果不是TickTuple,则将接收到的tuple更新到正在维护中的Rankings对象。


你可能感兴趣的:(storm)