我正在玩Storm,我想知道Storm在聚合时指定(如果可能)窗口大小(如果可能)。例如。如果我们想在Twitter上找到前一小时的热门话题。我们如何指定螺栓应该每小时返回结果?这是以编程方式在每个螺栓内完成的吗?或者是指定"窗口的某种方式" ?
答案 0 :(得分:17)
免责声明:我撰写了由gakhov in his answer above引用的风暴趋势主题文章。
我认为最佳做法是使用所谓的tick tuples in Storm 0.8+。通过这些,您可以配置自己的喷嘴/螺栓,以便在特定时间间隔(例如,每十秒或每分钟)通知。
这是一个简单的示例,它将有问题的组件配置为每十秒钟接收一次tick元组:
// in your spout/bolt
@Override
public Map<String, Object> getComponentConfiguration() {
Config conf = new Config();
int tickFrequencyInSeconds = 10;
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, tickFrequencyInSeconds);
return conf;
}
然后,您可以在spout / bolt的execute()
方法中使用条件开关来区分“正常”传入元组和特殊tick元组。例如:
// in your spout/bolt
@Override
public void execute(Tuple tuple) {
if (isTickTuple(tuple)) {
// now you can trigger e.g. a periodic activity
}
else {
// do something with the normal tuple
}
}
private static boolean isTickTuple(Tuple tuple) {
return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)
&& tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID);
}
再次,我写了一篇漂亮的detailed blog post关于在暴风雨中做这件事,就像加霍夫指出的那样(无耻的插头!)。
答案 1 :(得分:1)
添加一个并行度为1的新喷口,让它发出一个空信号,然后在下次使用Utils.sleep(全部在nextTuple中完成)。然后,使用all-grouping将所有相关螺栓链接到该喷口,这样它们的所有实例都将收到相同的信号。