Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184248
  • 博文数量: 26
  • 博客积分: 71
  • 博客等级: 民兵
  • 技术积分: 825
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:14
个人简介

希望在这里与大家一起交流学习,共同进步。。。

文章分类

全部博文(26)

文章存档

2019年(1)

2015年(5)

2014年(6)

2013年(13)

2012年(1)

我的朋友

分类: 大数据

2015-07-21 12:03:12

有关Storm的ack机制,详情大家可以参考  http://blog.csdn.net/xeseo/article/details/17754825

在这里只说一下ack的具体实现(当然在这里继承的父类(storm API中的类 如IRichSpout)中不包含已经实现好的ack机制):

首先,就像前面说的,在Spout中的nextTuple方法发送数据Tuple必须要有msgId.
例如:this.outputCollector.emit(new Values(), msgId); msgId可以自己随便设置

同时在Spout类中你可以在ack和fail方法中随便设置自己想实现的方法,重发机制也可以写。
如果处理成功,会直接调用ack方法
如果处理失败,会等超时之后才调用fail方法(一般fail方法调用有点慢,当然你也可以自己设置超时时间)

在Bolt中处理数据可能会产生成千上万个tuple,这样就需要anchor了,只需要像下面这样发送:
this.collector.emit(inputTuple, new Values());第一个参数是传入的Tuple,第二个参数是要发送的Tuple

但是无论现在这个Bolt是最后一个Bolt(即不再发送Tuple,到了整个拓扑的最后一步)还是中间处理数据的Bolt,只要你想anchor上,就必须调用ack或是fail方法
即在上面那个方法后面加上 this.collector.ack(inputTuple);或this.collector.fail(inputTuple);  例如:    
this.collector.emit(inputTuple, new Values());第一个参数是传入的Tuple,第二个参数是要发送的Tuple
this.collector.ack(inputTuple);

必须每条保证每条数据都调用了ack或是fail方法




阅读(3229) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~