storm容易混淆的继承对象的对比IRichBolt/IBasicBolt


IBolt

package backtype.storm.task;api

public interface IBolt extends Serializableapp

接收tuple做为输入,输出tuple,能够用来做过滤,连结,聚合等。spa

IBolt提交到Nimbus后,Nimbus将做业发送到worker后,每一个task初始化时都会调用prepare。orm

 

TopologyContext

package backtype.storm.task;对象

public class TopologyContext extends WorkerTopologyContext implements IMetricsContext继承

TopologyContext向bolts 和spouts 提供”prepare” and “open” 方法。 TopologyContext提供了组件的各类信息,流的信息,task的信息等。事务

ShellSpout/ShellBolt

package backtype.storm.task;get

public class ShellSpout implements ISpout it

package backtype.storm.spout;io

public class ShellBolt implements IBolt 

Storm能够用其它语言来实现SpoutBolt的功能,如PythonRubyShellSpout /ShellBolt 采用一个特别的协议,经过标准IO和其通讯。

IRichBolt/IBasicBolt

区别IRichBoltIBasicBolt

IRichBolt继承自IBoltIComponentIBasicBolt继承自IComponent,和IBolt没有继承关系。

实现IRichBoltBolt有:BaseRichBolt,ClojureBolt,CoordinatedBolt,KeyedFairBolt,RichShellBolt等。

实现IBasicBolt的有:BaseBasicBolt,IdentityBolt,PrepareBatchBolt等。

他们的区别在于IRichBolt须要手动的ackfail消息,若不ack,很快就outOfMemory了;而IBasicBolt不须要确认消息,自动完成。

看下面的OutputCollector和BasicOutputCollector。

OutputCollector/BasicOutputCollector

OutputCollector实现了IOutputCollector,方法有:emit,emitDirect,ack,fail。

BasicOutputCollector实现了IBasicOutputCollector,方法有:emit,emitDirect,reportError。

能够看到,OutputCollector暴露了emit APIIRichBolt,包括了ackfail,用来对应消息成功/失败后的处理,能够保证消息不丢失。具体能够看:如何保证消息不丢失

而BasicOutputCollector没有此api对应于IBasicBolt。

IBatchBolt

顾名思义,批处理的Bolt,与IRichBoltIBasicBolt也没有继承关系。这个bolt对象每次处理一批batch在一块儿的tuples。对于每个tuple调用execute方法。而在整个batch处理完成的时候调用finishBatch方法。而后新来一批tuples,会产生新的batchBolt来处理。具体能够见:

http://xumingming.sinaapp.com/736/twitter-storm-transactional-topolgoy/

BatchOutputCollector

和IBatchBolt对应的Collector

BaseTransactionalBolt

事务性的Bolt

记住:继承了BaseTransactionalBolt的classexecute方法中获取tuple时,应从下标为1开始获取,第0个为TransactionAttempt对象,为<txid,_attemptId>,用来记录tuples重放时。由于事务性的bolt继承了批处理的bolt,具体仍是见IBatchBolt中关于事务性拓扑的连接。

相关文章
相关标签/搜索