IRichBolt和IBasicBolt/BaseBasicBolt对比

作为storm的使用者,有两件事情要做以更好的利用storm的可靠性特征。 首先,在你生成一个新的tuple的时候要通知storm; 其次,完成处理一个tuple之后要通知storm。 这样storm就可以检测整个tuple树有没有完成处理,并且通知源spout处理结果。storm提供了一些简洁的api来做这些事情。

由一个tuple产生一个新的tuple称为: anchoring。你发射一个新tuple的同时也就完成了一次anchoring。看下面这个例子: 这个bolt把一个包含一个句子的tuple分割成每个单词一个tuple。

Java代码  

  1. public class SplitSentence implements IRichBolt {
  2. Output Collector _collector;
  3. public void prepare(Map conf,
  4. TopologyContext context,
  5. OutputCollector collector) {
  6. _collector = collector;
  7. }
  8. public void execute(Tuple tuple) {
  9. String sentence = tuple.getString(0);
  10. for(String word: sentence.split(" ")) {
  11. _collector.emit(tuple,newValues(word));
  12. }
  13. _collector.ack(tuple);
  14. }
  15. public void cleanup() {
  16. }
  17. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  18. declarer.declare(newFields("word"));
  19. }
  20. }

我们通过anchoring来构造这个tuple树,最后一件要做的事情是在你处理完当个tuple的时候告诉storm,  通过OutputCollector类的ack和fail方法来做,如果你回过头来看看SplitSentence的例子, 你可以看到“句子tuple”在所有“单词tuple”被发出之后调用了ack。

你可以调用OutputCollector 的fail方法去立即将从消息源头发出的那个tuple标记为fail, 比如你查询了数据库,发现一个错误,你可以马上fail那个输入tuple, 这样可以让这个tuple被快速的重新处理, 因为你不需要等那个timeout时间来让它自动fail。

每个你处理的tuple, 必须被ack或者fail。因为storm追踪每个tuple要占用内存。所以如果你不ack/fail每一个tuple, 那么最终你会看到OutOfMemory错误。

大多数Bolt遵循这样的规律:读取一个tuple;发射一些新的tuple;在execute的结束的时候ack这个tuple。这些Bolt往往是一些过滤器或者简单函数。Storm为这类规律封装了一个BasicBolt类。如果用BasicBolt来做, 上面那个SplitSentence可以改写成这样:

Java代码  

  1. public class SplitSentence implements IBasicBolt {
  2. public void prepare(Map conf,
  3. TopologyContext context) {
  4. }
  5. public void execute(Tuple tuple,
  6. BasicOutputCollector collector) {
  7. String sentence = tuple.getString(0);
  8. for(String word: sentence.split(" ")) {
  9. collector.emit(newValues(word));
  10. }
  11. }
  12. public void cleanup() {
  13. }
  14. public void declareOutputFields(
  15. OutputFieldsDeclarer declarer) {
  16. declarer.declare(newFields("word"));
  17. }
  18. }

这个实现比之前的实现简单多了, 但是功能上是一样的。

发送到BasicOutputCollector的tuple会自动和输入tuple相关联,而在execute方法结束的时候那个输入tuple会被自动ack的。
我们编写的时候使用IBasicBolt最方便了。或者 extends BaseBasicBolt类

IRichBolt和IBasicBolt对比

时间: 2024-11-15 00:59:08

IRichBolt和IBasicBolt/BaseBasicBolt对比的相关文章

Storm入门(八)Storm实战常见问题总结

一.本地环境log级别设置问题 storm-core-1.1.0.jar下面有个log4j2.xml文件,默认log级别是info. <configuration monitorInterval="60"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%-4r [%t] %-5p

Storm实战常见问题及解决方案

文档说明 该文档包涵了storm实战中经常遇到一些问题,及对应解决方案.这个文档是群里一个朋友在学习storm,并实战storm中遇到的一些问题,及和群里其他朋友一起交流给出的对应解决方案,并由他整理好,委托我发布出来(也算是交流者之一),供大家参考,希望能对大家有所帮助. 感谢 某某(哈哈 鉴于部分原因,不便透露名字~~~~!)… 问题锦集 1 关于Storm集群 1.1 关于storm集群的环境变量配置问题 安装好JDK后,需要配置环境变量,通常情况下出于经验,我们往往会修改/etc/pro

转载文档:Storm实战常见问题及解决方案

该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实战中遇到的一些问题,及其对应解决办法.     相关描述 ²  其他相关文档请参考新浪博客http://blog.sina.com.cn/huangchongyuan ²  有任何其他想法,可以邮件[email protected] ² 文档及相关资料下载请个人360云盘http://yunpan.

Storm Topology及分组整理

Storm的通信机制,需要满足如下一些条件以满足Storm的语义. 1.建立数据传输的缓冲区.在通信连接没有建立之前把发送的数据缓存起来.数据发送方可以在连接建立之前发送消息,而不需要等连接建立起来,可是的接收方是独立运行的. 2.在消息传输层保证消息最多只能发送一次,Storm系统有ACK机制,是的没有被发送成功的消息会被重发,若消息层面也重发,会导致消息发送多次. 这种消息机制由两个接口来定义,backtype.storm.messaging.IContext和backtype.storm.

apache storm基本原理及使用总结

什么是Apache Storm Apache Storm是一个分布式实时大数据处理系统.Storm设计用于在容错和水平可扩展方法中处理大量数据.它是一个流数据框架,具有最高的摄取率.虽然Storm是无状态的,它通过Apache ZooKeeper管理分布式环境和集群状态.通过Storm可以并行地对实时数据执行各种操作.Storm易于部署和操作,并且它可以保证每个消息将通过拓扑至少处理一次. Apache Storm核心概念 Apache Storm从一端读取??实时数据的原始流,并将其传递通过一

JStorm:概念与编程模型

1.集群架构 JStorm从设计的角度,就是一个典型的调度系统,简单集群的架构如下图所示,其中Nimbus可增加一个备节点,多个Supervisor节点组成任务执行集群. 1.1.Nimbus Nimbus是作为整个集群的调度器角色,负责分发topology代码.分配任务,监控集群运行状态等,其主要通过ZK与supervisor交互.可以和Supervisor运行在同一物理机上,JStorm中Nimbus可采用主从备份,支持热切. 1.2.Supervisor Supervisor 是集群中任务

Storm的BaseBasicBolt源码解析ack机制

我们在学习ack机制的时候,我们知道Storm的Bolt有BaseBasicBolt和BaseRichBolt.在BaseBasicBolt中,BasicOutputCollector在emit数据的时候,会自动和输入的tuple相关联,而在execute方法结束的时候那个输入tuple会被自动ack.在使用BaseRichBolt需要在emit数据的时候,显示指定该数据的源tuple要加上第二个参数anchor tuple,以保持tracker链路,即collector.emit(oldTup

jquery和vue对比

jquery和vue对比 前言:很多人说jquey和vue没有什么可比的,应该和Angular,React来比吧,我到觉得他们倒没有多大的可比性,都是基于mvvm思想设计的框架,无非就是实现的方式不一样,在不同场景下性能上会有一些差异.然而从jquery到vue或者说是到mvvm的转变则是一个思想想的转变,是将原有的直接操作dom的思想转变到操作数据上去,难道不是一个根本性的改变吗? 1.jquery介绍:想必大家都用过jquery吧,这个曾经也是现在依然最流行的web前端js库,可是现在无论是

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hibernate. 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求