原文:http://storm.apache.org/documentation/Concepts.html html
這個列表展現了storm中的主要概念和相關詳細信息。這些概念是:java
Topologies數據庫
Streamsapache
Spoutsapi
Bolts安全
Stream groupings異步
Reliability分佈式
Tasksui
Worksspa
實時處理邏輯被包含在一個storm topology中。一個storm topology 與MapReduce job類似。其中一個關鍵不一樣是MapReduce job最終會中止,可是topology會一直運行(除非你kill它)。一個topology是一系列經過數據流鏈接起來的spout和bolt。下面將描述這些概念。
更多資源:
TopologyBuilder:在Java程序中,使用這個類構建topology
Running topologies on a production cluster(在集羣上運行topology)
Local mode:如何在本地開發和調試topology
Stream是storm的核心抽象。Stream是經過分佈式方式平行創造出的一個無限制的tuples隊列。Stream要爲tuples中的fields(屬性)命名。在默認狀況下,tuples中能夠有integers,longs,shorts,bytes,Strings,doubles,floats,booleans和byte arrays。固然,你也能夠在tuples中使用自定義序列化(serializers)類型。
每個Stream在聲明時都會給一個id。由於單一流的spouts和bolts很是常見,OutputFieldsDeclarer有很是方便的方法聲明一個沒有指定id的流。在這種狀況下,這個流被給定了一個默認id:「default」
更多資源:
Tuple:stream是由tuples組成的。
OutputFieldsDeclarer:用來聲明一個流
Serialization:tuples的動態類型信息並聲明自定義序列換類型
ISerialization:自定義序列換類型必須實現的接口
CONFIG.TOPOLOGY_SERIALIZATIONS:自定義序列換類型能夠經過這個配置進行
Spout是storm中流的源頭。一般的spouts從外部數據源中讀取數據而後向topology中發射。Spout分爲可重發(reliable)和非可重發(unreliable)兩種。一個可重發的spout會在storm處理失敗後再次發送處理失敗的tuple,而非可重發的spout在發射完一個tuple以後就再也不關注後續處理。
Spout能夠發射多條Stream。可使用OutputFieldsDeclarer中的declareStream方法聲明多個Stream,並在使用時經過SpoutOutputCollector的emit方法發射數據。
Spout中最主要的方法是nextTuple。nextTuple能夠向topology發射數據或在沒有數據要發射的時候返回。在spout實現類中沒有必要給nextTuple加鎖,由於storm會在同一個線程中調用全部的spout方法。
其餘兩個重要的方法是ack和fail。當storm發現從spout發射出的tuple在整個topology過程當中處理成功或失敗時,會調用響應的ack或fail方法。只有在可重發的spout中才會調用ack或fail方法。
更多資源:
IRichSpout:全部spout必須實現的接口
Guaranteeing message processing(保證消息處理機制)
Topologies中的全部處理過程都是在bolts中完成的。Bolts經過過濾(filtering)、方法(function)、聚合(aggregation)、鏈接(joins)、訪問數據庫等方式作任意數據操做。
Bolts能夠作簡單的Stream轉換。可是作複雜的Stream轉換須要在更多的bolt中執行多個步驟。舉例來講:講一個tweet Stream轉換爲一個熱門圖片Stream至少須要兩個步驟:一個bolt統計每一個圖片的關注者(retweets),另外一個bolt算出前幾名的圖片(你能夠用更加可拓展的方式處理這個數據Stream轉換,好比使用3個bolt)
bolts能夠發射多條Stream。可使用OutputFieldsDeclarer中的declareStream方法聲明多個Stream,並在使用時經過SpoutOutputCollector的emit方法發射數據。
當你在bolt中聲明瞭一個輸入Stream,就意味着bolt從另外一個組件(component)上訂閱了一個特定的Stream。若是你但願訂閱另外一個組件上的全部流,須要分別聲明訂閱。InputDeclarer提供了一個經過默認Stream id訂閱流的方法。好比declarer.shuffleGrouping("1")
表示你從組件1上訂閱了默認流,至關於declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)
.
Bolt中的主方法是execute
,每從輸入Stream中讀取數據時會調用它。Bolts經過OutputCollector發射新的tuples。Bolts須要在OutputCollector發射每一個tuple完成以後調用ack方法,以便於storm知道tuple何時完成(能夠最終確認原始spout發射的tuple是處理成功的)。一般狀況下,tuple每處理一個輸入tuple,會在輸入tuple的基礎上發射0或多個tuples,而後ack輸入tuple,storm提供了一個接口IBasicBolt能夠自動的調用ack方法。
在bolts中啓動多個線程進行異步處理數據是一個完美的方法。OutputCollector是線程安全的,而且能夠隨時調用。
更多資料:
IRichBolt: bolts實現的基礎接口
IBasicBolt:一個便利的接口,具有過濾功能和簡單方法
OutputCollector:bolts用來向輸出steam發射tuples的實例。
Guaranteeing message processing(保證消息處理機制)
定義在topology中,每一個bolt選擇哪一個Stream做爲輸入。一個Stream grouping定義了Stream在多個bolt’s tasks中如何分配。
在storm中有7種內置的Stream grouping方式,你能夠經過實現CustomStreamGrouping接口來建立本身的Stream grouping。
Shuffle grouping: Tuples被隨機分配到每個bolt’s task,以便於每個bolt’s task得到相同數量的tuples。
Fields grouping: Stream被根據屬性(fields)進行分組。舉例:若是一個Stream根據「user-id」分組,具備相同「user-id」屬性的tuples會被髮往同一個bolt’s task,具備不一樣「user-id」的tuples有可能發往不一樣的bolt’s task。
All grouping:Stream會被重複的發往每個bolt’s task,使用這個方式須要慎重。
Global grouping:輸入流會發往bolt’s tasks中的一個。具體來講,會發往最小id的task
None grouping:這種方式表示你並不關心Stream如何分組。當前版本中,它的效果等同於shuffle grouping。Eventually though, Storm will push down bolts with none groupings to execute in the same thread as the bolt or spout they subscribe from (when possible).
Direct grouping:這是一個特殊的grouping。這種方式可讓tuple的生產者決定消費者中哪個task可以接收這個tuple。只有當一個Stream聲明是一個direct stream時,Direct grouping方式才能生效。必須使用[emitDirect](/apidocs/backtype/storm/task/OutputCollector.html#emitDirect(int, int, java.util.List)方法,才能將tuple發送到一個direct Stream中。一個bolt能夠經過兩種方式獲取到消費者的taskid,一種是使用TopologyContext獲取,另外一種是經過跟蹤OutputCollector中的emit方法的返回值(當tuples發送以後,會返回task ids)
Local or shuffle grouping:若是目標bolt在一個worker進程中有多個或一個tasks,tuples會隨機發送到進程內的tasks。不然,這種方式與shuffle grouping相同。
相關資料
TopologyBuilder:用來建立topology的類
InputDeclarer:這個對象在調用TopologyBuilder類的setBolt
方法時返回,用來聲明一個bolt的輸入Stream和這些Stream用什麼樣的grouping方式。
CoordinatedBolt:這個bolt用於分佈式RPC topologies,並大量使用direct Stream和direct groupings。
Storm確保沒有個spout發出的tuple將會被topology完整的處理。經過創建一顆樹來跟蹤spout發出的每個tuple,並且決定tuple有多長時間處理完畢。每個topology有一個「message timeout」配置這個時間。若是storm發現tuple在這個時間內沒有完成這棵樹,那麼這個tuple就是fail,並從新處理這個tuple。
爲了很好的利用storm的可靠性機制,你必須告知storm何時在監控樹上建立了一個新的路徑,並在何時完成了一個tuple的處理。這些在bolts使用OutputCollector發送完tuple時要作的。在肯定完成了emit方法以後,必須調用ack方法來告知處理了這個tuple。
更多信息在Guaranteeing message processing.
每個spout或bolt在集羣中運行多個tasks。每個task至關於程序中的一個線程,Stream grouping定義瞭如何將tuples從一個task集合到另外一個task集合。你能夠爲每個spout或bolt在類中TopologyBuilder的setSpout
或setBolt
方法
設置平行度(parallelism)。
Topologies執行一個或多個worker進程。每一個worker進程是一個運行task子集的物理虛擬機。舉例:若是一個topology一共有300個tasks和50個workers,那麼每個worker執行6個tasks。Storm嘗試將tasks平均的分配到每個worker。
相關資料:
Config.TOPOLOGY_WORKERS:執行topology的worker數量