(Twitter)风暴的聚合窗口

gro*_*eck 7 real-time-data real-time-systems apache-storm

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

Mic*_*oll 17

免责声明:我在上面的回答中写了gakhov引用的风暴趋势主题文章.

我想说最好的做法是在Storm 0.8+中使用所谓的tick元组.通过这些,您可以配置自己的喷口/螺栓,以便在特定时间间隔(例如,每十秒或每分钟)通知.

这是一个简单的示例,它将有问题的组件配置为每十秒接收一次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;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在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);
}
Run Code Online (Sandbox Code Playgroud)

再一次,我写了一篇非常详细的博客文章,关于在几天前在暴风雨中做这个,因为gakhov指出(无耻插头!).