IBolt
package backtype.storm.task;
public interface IBolt extends Serializable
接收tuple作为输入,输出tuple,可以用来作过滤,连结,聚合等。
IBolt提交到Nimbus后,Nimbus将作业发送到worker后,每个task初始化时都会调用prepare。
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;
public class ShellSpout implements ISpout
package backtype.storm.spout;
public class ShellBolt implements IBolt
Storm可以用其它语言来实现Spout和Bolt的功能,如Python和Ruby。ShellSpout /ShellBolt 采用一个特别的协议,通过标准IO和其通信。
IRichBolt/IBasicBolt
区别IRichBolt和IBasicBolt
IRichBolt继承自IBolt和IComponent。IBasicBolt继承自IComponent,和IBolt没有继承关系。
实现IRichBolt的Bolt有:BaseRichBolt,ClojureBolt,CoordinatedBolt,KeyedFairBolt,RichShellBolt等。
实现IBasicBolt的有:BaseBasicBolt,IdentityBolt,PrepareBatchBolt等。
他们的区别在于IRichBolt需要手动的ack或fail消息,若不ack,很快就outOfMemory了;而IBasicBolt不需要确认消息,自动完成。
看下面的OutputCollector和BasicOutputCollector。
OutputCollector/BasicOutputCollector
OutputCollector实现了IOutputCollector,方法有:emit,emitDirect,ack,fail。
BasicOutputCollector实现了IBasicOutputCollector,方法有:emit,emitDirect,reportError。
可以看到,OutputCollector暴露了emit API给IRichBolt,包括了ack和fail,用来对应消息成功/失败后的处理,可以保证消息不丢失。具体可以看:
而BasicOutputCollector没有此api,对应于IBasicBolt。
IBatchBolt
顾名思义,批处理的Bolt,与IRichBolt和IBasicBolt也没有继承关系。这个bolt对象每次处理一批batch在一起的tuples。对于每一个tuple调用execute方法。而在整个batch处理完成的时候调用finishBatch方法。然后新来一批tuples,会产生新的batchBolt来处理。具体可以见:
BatchOutputCollector
和IBatchBolt对应的Collector
BaseTransactionalBolt
事务性的Bolt。
记住:继承了BaseTransactionalBolt的class在execute方法中获取tuple时,应从下标为1开始获取,第0个为TransactionAttempt对象,为<txid,_attemptId>,用来记录tuples重放时。因为事务性的bolt继承了批处理的bolt,具体还是见IBatchBolt中关于事务性拓扑的链接。