Storm应用系列之——Spout、Bolt API

转载 2015年11月18日 19:31:13
1、Component

Storm中,Spout和Bolt都是其Component。所以,Storm定义了一个名叫IComponent的总接口


 

全家普如下:


 

绿色部分是我们最常用、比较简单的部分。红色部分是与事务相关的,在以后的文章会具体讲解。

BaseComponent 是Storm提供的“偷懒”的类。为什么这么说呢,它及其子类,都或多或少实现了其接口定义的部分方法。这样我们在用的时候,可以直接继承该类,而不是自己每次都写所有的方法。但值得一提的是,BaseXXX这种定义的类,它所实现的方法,都是空的,直接返回null。 



2、Spout

在前面基本例子中,我们实现了一个RandomSpout,来看看其类图

 

  • Spout的最顶层抽象是ISpout接口。

 


open方法是初始化动作。允许你在该spout初始化时做一些动作,传入了上下文,方便取上下文的一些数据。
close方法在该spout关闭前执行,但是并不能得到保证其一定被执行。spout是作为task运行在worker内,在cluster模式下,supervisor会直接kill -9 woker的进程,这样它就无法执行了。而在本地模式下,只要不是kill -9, 如果是发送停止命令,是可以保证close的执行的。
activate和deactivate :一个spout可以被暂时激活和关闭,这两个方法分别在对应的时刻被调用。
nextTuple 用来发射数据。
ack(Object)
传入的Object其实是一个id,唯一表示一个tuple。该方法是这个id所对应的tuple被成功处理后执行。
fail(Object)
同ack,只不过是tuple处理失败时执行。

我们的RandomSpout 由于继承了BaseRichSpout,所以不用实现close、activate、deactivate、ack、fail和getComponentConfiguration方法,只关心最基本核心的部分。

结论:
通常情况下(Shell和事务型的除外),实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout。





3、Bolt


ExclaimBasicBolt的类图:
 
这里可以看到一个奇怪的问题:
为什么IBasicBolt并没有继承IBolt?
我们带着问题往下看。

IBolt定义了三个方法:
 

  • IBolt继承了java.io.Serializable,我们在nimbus上提交了topology以后,创建出来的bolt会序列化后发送到具体执行的worker上去。worker在执行该Bolt时,会先调用prepare方法传入当前执行的上下文
  • execute接受一个tuple进行处理,并用prepare方法传入的OutputCollector的ack方法(表示成功)或fail(表示失败)来反馈处理结果
  • cleanup 同ISpout的close方法,在关闭前调用。同样不保证其一定执行。
红色部分是Bolt实现时一定要注意的地方。而Storm提供了IBasicBolt接口,其目的就是实现该接口的Bolt不用在代码中提供反馈结果了,Storm内部会自动反馈成功。
如果你确实要反馈失败,可以抛出FailedException。

我们来再写一个Bolt继承BaseRichBolt替代ExclaimBasicBolt。代码如下:
  1.     public class ExclaimRichBolt extends BaseRichBolt {  
  2.       
  3.         private OutputCollector collector;  
  4.           
  5.         @Override  
  6.         public void prepare(Map stormConf, TopologyContext context,  
  7.                 OutputCollector collector) {  
  8.             this.collector = collector;  
  9.         }  
  10.       
  11.         @Override  
  12.         public void execute(Tuple tuple) {  
  13.             this.collector.emit(tuple, new Values(tuple.getString(0)+"!"));  
  14.             this.collector.ack(tuple);  
  15.         }  
  16.       
  17.         @Override  
  18.         public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  19.             declarer.declare(new Fields("after_excl"));  
  20.         }  
  21.       
  22.     }  
复制代码
修改topology
  1.     //builder.setBolt("exclaim", new ExclaimBasicBolt(), 2).shuffleGrouping("spout");  
  2.     builder.setBolt("exclaim", new ExclaimRichBolt(), 2).shuffleGrouping("spout");  
复制代码
运行下,结果一致。

结论:
通常情况下,实现一个Bolt,可以实现IRichBolt接口或继承BaseRichBolt,如果不想自己处理结果反馈,可以实现IBasicBolt接口或继承BaseBasicBolt,它实际上相当于自动做掉了prepare方法和collector.emit.ack(inputTuple);



原帖地址:
http://blog.csdn.net/xeseo/article/details/17750379

相关文章推荐

Storm应用系列之——Spout、Bolt API

Storm中常用的Bolt和Spout API介绍
  • xeseo
  • xeseo
  • 2014年01月02日 13:19
  • 12231

Storm——spout,bolt

前言:         昨天有朋友聊天说,我写的前面三篇太简单了,没有太多深入的东西。好吧,这说明我的目的达到了。我写这个系列的原因就是为了面向应用,进一步细化为两点:         1. 以例...

Storm 基础 -- spout与bolt设置多重grouping

Topology的代码如下:TopologyBuilder builder = new TopologyBuilder(); //WordReaderSpout会从文件中读取数据,数据用shuffle...

Storm之Spout、Bolt、Topology组件

1.Spout实现   Strom使用元组作为数据模型,元组就是一组命名的值,元组中的每个字段都可以是任何类型的对象。Storm支持所有基本类型,string和byte数组作为元组字段值。如果要使用...
  • wdasdaw
  • wdasdaw
  • 2015年10月04日 14:38
  • 2587

Storm拓扑,组件之spout、bolt,并行策略

软件版本:Storm:0.9.3 ,Redis:2.8.19;jedis:2.6.2;参考:http://storm.apache.org/documentation/Understanding-th...

storm中supervisor, task, worker, spout, bolt之间的关系

一个storm topology运行起来之后, 会在supervisor 机器上启动一些进程来运行spout和bolt实例.  如果一个topology里面一共有一个spout, 一个bolt。...

流处理旅程——storm之spout介绍

核心 Spout中方法的说明1、Spout数据源 消息源Spout是storm的Topology中的消息生产者。2、spout介绍 2、1spout的结构 Spout是storm的核心组件之一...
  • paicMis
  • paicMis
  • 2017年02月16日 23:53
  • 816

strom中worker、task、spout/bolt、executor、component的关系

整理一下网上有关worker、task、spout/bolt、executor、component的关系

Storm应用系列之——Topology部署

Storm的topology不同部署方式,以及其部署原理
  • xeseo
  • xeseo
  • 2014年01月13日 13:14
  • 8383

Storm应用系列之——集成Kafka

本文系原创系列,转载请注明。 原帖地址:http://blog.csdn.net/xeseo 前言 在前面Storm系列之——基本概念一文中,提到过Storm的Spout应该是源源不断的...
  • xeseo
  • xeseo
  • 2014年01月21日 18:42
  • 22031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Storm应用系列之——Spout、Bolt API
举报原因:
原因补充:

(最多只允许输入30个字)