流式数据处理框架storm中,主要是进行数据流的处理。数据是源源不断进来的。但同时有很多同学会问,能不能在storm里面进行的定时操作?如,每隔1分钟将数据整合一次并存入数据库。以1分钟的时间间隔为一个周期对数据进行操作。
这样是可以的。
当然,主要是在处理结点Bolt中进行的。
方法:(本文中的Bolt均是实现的IRichBolt接口)
在方法getComponentConfiguration()中,进行配置文件的添加:
<span style="white-space:pre"> </span>Map<String, Object> conf = new HashMap<String, Object>();
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 60);// 设置本Bolt定时发射数据(所以这个地方我们可以偷偷地进行某些定时处理)
return conf;
以上的配置文件内容为:设置一个Topology的时钟周期为60s。这样,便可以在一个指定的时间周期完成后进行一定的操作。
经过上面的配置,系统会在经过一定的时间长度后,给本bolt发射一个触发用的tuple,用作通知本线程周期时间已到,需要做周期工作了。
因此,需要添加一个方法,来判断execute(Tuple tuple)方法中的这个tuple是否是系统的时钟tuple。,方法如下:
/**
* 根据传送过来的Tuple,判断本Tuple是否是tickTuple 如果是tickTuple,则触发动作
*
* @param tuple
* @return
*/
public static boolean isTickTuple(Tuple tuple) {
return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID) // SYSTEM_COMPONENT_ID
&& tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID); // SYSTEM_TICK_STREAM_ID
// == "__tick"
}
将isTickTuple()方法添加完毕后,下面需要在execute(方法中进行判断)。一般的写法如下:
@Override
public void execute(Tuple tuple) {
if (isTickTuple(tuple)) {// 如果是系统时钟tuple,则读取dim_top
//执行周期活动
//执行完毕后直接return结束本execute方法
return;
}
//执行正常的tuple处理操作
……
……
……
}
这样,便可以实现bolt中的周期操作。