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中關於事務性拓撲的連接。

相關文章
相關標籤/搜索