package backtype.storm.task;api
public interface IBolt extends Serializableapp
接收tuple做爲輸入,輸出tuple,能夠用來做過濾,連結,聚合等。spa
IBolt提交到Nimbus後,Nimbus將做業發送到worker後,每一個task初始化時都會調用prepare。orm
package backtype.storm.task;對象
public class TopologyContext extends WorkerTopologyContext implements IMetricsContext繼承
TopologyContext向bolts 和spouts 提供」prepare」 and 「open」 方法。 TopologyContext提供了組件的各類信息,流的信息,task的信息等。事務
package backtype.storm.task;get
public class ShellSpout implements ISpout it
package backtype.storm.spout;io
public class ShellBolt implements IBolt
Storm能夠用其它語言來實現Spout和Bolt的功能,如Python和Ruby。ShellSpout /ShellBolt 採用一個特別的協議,經過標準IO和其通訊。
區別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實現了IOutputCollector,方法有:emit,emitDirect,ack,fail。
BasicOutputCollector實現了IBasicOutputCollector,方法有:emit,emitDirect,reportError。
能夠看到,OutputCollector暴露了emit API給IRichBolt,包括了ack和fail,用來對應消息成功/失敗後的處理,能夠保證消息不丟失。具體能夠看:如何保證消息不丟失
而BasicOutputCollector沒有此api,對應於IBasicBolt。
顧名思義,批處理的Bolt,與IRichBolt和IBasicBolt也沒有繼承關係。這個bolt對象每次處理一批batch在一塊兒的tuples。對於每個tuple調用execute方法。而在整個batch處理完成的時候調用finishBatch方法。而後新來一批tuples,會產生新的batchBolt來處理。具體能夠見:
http://xumingming.sinaapp.com/736/twitter-storm-transactional-topolgoy/
和IBatchBolt對應的Collector
事務性的Bolt。
記住:繼承了BaseTransactionalBolt的class在execute方法中獲取tuple時,應從下標爲1開始獲取,第0個爲TransactionAttempt對象,爲<txid,_attemptId>,用來記錄tuples重放時。由於事務性的bolt繼承了批處理的bolt,具體仍是見IBatchBolt中關於事務性拓撲的連接。