参考:http://120.25.204.125/ProgrammingGuide_cn/AdvancedUsage/Window.html
在流式计算中我们经常需要以时间或者数据量将无界的数据划分成一份份有限的集合,然后以这个集合为维度进行操作。
1、你可以写定时任务,或者计数器,批量处理
2、使用window API
滚动窗口(Tumbling Window)
每个Tuple只能属于其中一个滚动窗口,一个Tuple不能同时是两个或者两个以上窗口的元素。比如下面我们以消息到达的时间来划分成一个个滚动窗口,窗口大小是5秒:
第一个窗口w1包含的是0~5th到达的数据,第二窗口w2包含的是5~10th秒到达的数据,第三个窗口包含的是10~15th秒到达的数据。每个窗口每隔5秒被计算,窗口和窗口直接没有重叠。
滑动窗口(Sliding Window)
tuples被划分到一个个滑动窗口,窗口滑动的间隔是sliding interval。每个窗口间会有重叠,重叠部分的tuple可以先后属于前后两个窗口。比如下面我们以事件处理时间划分滑动窗口,窗口大小是10秒,滑动间隔是5秒:
第一个窗口w1包含的是0~10th到达的数据,第二窗口w2包含的是5~15th秒到达的数据。消息时间e3~e6都是窗口w1和w2的一部分。在15th秒时,窗口w2会被计算,这时候e1 e2的数据会会过期,会从队列中移除。
Storm支持以时间、数量或者以两者混合的方式来定义窗口带下及窗口滑动间隔。
- withWindow(Count windowLength, Count slidingInterval)
滑窗 窗口长度:tuple数, 滑动间隔: tuple数 - withWindow(Count windowLength)
滑窗 窗口长度:tuple数, 滑动间隔: 每个tuple进来都滑 - withWindow(Count windowLength, Duration slidingInterval)
滑窗 窗口长度:tuple数, 滑动间隔: 时间间隔 - withWindow(Duration windowLength, Duration slidingInterval)
滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔 - withWindow(Duration windowLength)
滑窗 窗口长度:时间间隔, 滑动间隔: 每个tuple进来都滑 - withWindow(Duration windowLength, Count slidingInterval)
滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔 - withTumblingWindow(BaseWindowedBolt.Count count)
滚窗 窗口长度:Tuple数 - withTumblingWindow(BaseWindowedBolt.Duration duration)
滚窗 窗口长度:时间间隔
builder.setSpout("spout", new RandomSentenceSpout(), 1);
builder.setBolt("slidingwindowbolt",
new SlidingWindowBolt().withWindow(new Count(30), new Count(10)),
1).shuffleGrouping("spout");
public class SlidingWindowBolt extends BaseWindowedBolt {
private OutputCollector collector;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
}
@Override
public void execute(TupleWindow inputWindow) {
for(Tuple tuple: inputWindow.get()) {
// do the windowing computation
...
}
// emit the results
collector.emit(new Values(computedValue));
}
}