有时候我们的bolt处理统计逻辑时,需要阶段统计一下,再把统计结果emit到后面的汇总统计bolt处理,因此需要在本地作一个定时阶段的统计,时间满后再后端的bolt emit数据。
阶段统计的bolt实现方法如下:
public void execute(Tuple tuple, BasicOutputCollector collector) {
if (TupleHelpers.isTickTuple(tuple)) {
//log.info("tick tuple: " + tuple);
emitCountingData(collector);
} else {
countInLocal(tuple);
}
}
此bolt还要override一个父类的方法,如下:
@Override
public Map<String, Object> getComponentConfiguration() {
Map<String, Object> conf = new HashMap<>();
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, emitFrequencyInSeconds);
return conf;
}
emitFrequencyInSeconds表示阶段统计的时间,单位秒。
TupleHelpers的实现如下:
import backtype.storm.Constants;
import backtype.storm.tuple.Tuple;
public final class TupleHelpers {
private TupleHelpers() {
}
public static boolean isTickTuple(Tuple tuple) {
return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)
&& tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID);
}
}