(Twitter)风暴的聚合窗口

时间:2012-09-26 14:25:05

标签: apache-storm real-time-data real-time-systems

我正在玩Storm,我想知道Storm在聚合时指定(如果可能)窗口大小(如果可能)。例如。如果我们想在Twitter上找到前一小时的热门话题。我们如何指定螺栓应该每小时返回结果?这是以编程方式在每个螺栓内完成的吗?或者是指定"窗口的某种方式" ?

2 个答案:

答案 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将所有相关螺栓链接到该喷口,这样它们的所有实例都将收到相同的信号。