源码来自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里。
SlotBasedConter实际上是维护一个Map<T, long[]> objToCounts对象。
下图说明的是SlidingWindowCounter如何维护一个对象的计数。
每一个被统计的对象都有如上图这样一个SlotBasedCounter对象进行统计。
2. IntermediateRankingsBolt
该类继承自抽象类AbstractRankerBolt(继承自BaseBasicBolt)。维护了一个topN大小的Rankings对象。Rankings类实际上是维护一个List<Rankable>的更新查找等操作。
在execute方式执行时,如果来的是TickTuple,则用emitRankings方法发送Rankings结果;如果不是TickTuple,则将接收到的tuple更新到正在维护中的Rankings对象。