Storm分布式处理中进行定时操作

流式数据处理框架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处理操作
		……
		……
		……
	}


当是系统的时钟时,则调用周期操作,完毕后return;否则,进行正常的tuple处理操作。
这样,便可以实现bolt中的周期操作。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值