上一篇【storm初識】 博文鏈接:https://my.oschina.net/u/2342969/blog/871432數據庫
本文將對storm的概念進行解釋和進一步闡述,將要講解的概念有:數組
topologies是實時處理計算的程序邏輯的程序包,一個topologies相似於一個 MapReduce 任務,MapReduce 任務是最終完成,而一個拓撲能夠永遠運行(只到你殺死它爲止)。一個topologies是Spouts和Bolts 在storm集羣中鏈接關係結構圖。安全
後續還會有詳細的在生產以及本地部署、測試、提交Topologies學習和介紹。請你們多多關注!!!負載均衡
Streams是storm中一個核心的概念,它是在分佈式並行處理和建立的無限序列元組,Streams經過給流元組中字段命名來定義,默認狀況下,元組能夠包含整型,長整型,短整型,字節,字符串,布爾型,雙精度浮點型,單精度浮點型,字節數組,也能夠自定義序列化類型。異步
聲明任何一個stream須要給定一個ID(非必須),單一stream,一個Spouts對應一個Bolts也是很常見。「OutputFieldsDeclarer」 接口爲聲明沒有指定id的stream提供個簡便的方法,這種狀況下,stream會有一個名稱爲「 "default" 的默認id。流是有元組組成。分佈式
後續還會有詳細講解 Tuple(元組),OutputFieldsDeclarer,元組中動態類型以及自定義序列化,請多多關注!!!wordpress
Spouts是一個拓撲中stream(數據流)的源頭,一般狀況下,Spouts從其餘應用源(消息等數據載體)讀取 tuples(元組) ,發送到拓撲中,spouts能夠是可靠或不可靠二者之一,當一個 tuples(元組)被storm處理失敗時, 可靠的Spouts將自動從新發送,不可靠的Spouts會丟棄。性能
Spouts能夠發送不止一個數據流,當使用SpoutOutputCollector的emit方法發送時,能夠經過OutputFieldsDeclarer的declareStream方法聲明多個Stream(數據流)和指定數據流進行發送。學習
Spouts 中有個重要的方法--nextTuple。nextTuple方法能夠發送一個新的Tuple(元組)到拓撲,若是沒有新的元組須要發送,則會直接返回。nextTuple方法不會影響任何Spouts 的實現,因此storm能夠在相同的線程內調用全部spout方法。測試
Spouts 中還有另外兩個重要的方法--ack 和 fail,storm發現一個spout發送Tuple(元組)徹底成功或者失敗是就會調用,這兩個方法只會被可靠Spouts調用。
後續還會有詳細講解 如何聲明Spouts以及 Spouts 如何有效的處理消息,請多多關注!!!
拓撲中的全部處理工做都在bolts中執行,bolts能夠作過濾,功能,計算,合併,數據庫交互等等處理元組的操做。
bolts能夠作一些簡單數據流傳輸,若是作複雜的數據流傳輸,須要分紅多步使用多個bolt。好比,轉移一個流爲統計圖至少須要兩步:一個bolt爲沒一個統計圖循環彙總統計數據,在生成某個統計圖前須要一個或者多個bolt進行轉換(多個比一個的伸縮性更強)。
bolts 能夠發送不止一個數據流,當使用OutputCollector的emit方法發送時,能夠經過OutputFieldsDeclarer的declareStream方法聲明多個Stream(數據流)和指定數據流進行發送。
當聲明一個bolt的輸入流時,就須要訂閱特定數據流的另外一個組件。若是須要訂閱另外一個組件的全部數據流,就必須一個一個訂閱。InputDeclarer有個簡便的語法,能夠在默認stream ID上訂閱這個數據流。好比,declarer.shuffleGrouping("1") 和 declarer.shuffleGrouping("1", DEFAULT_STREAM_ID) 語法同樣,均是訂閱組件「1」上的默認stream id。
bolts 還有一個重要的execute方法,它能夠將處理好新元組發送給OutputCollector。在execute方法中,bolts 應當爲每一個元組調用OutputCollector的ack方法,以便storms確保每一個元組都能正確的執行完成。最多見的場景是,基於一個元組發送0個或者多個元組,而後接收新的輸入元組,bolts提供了一個IBasicBolt 接口自動接收。
bolts能夠很好的啓用新線程進行異步處理,OutputCollector在任什麼時候候都是線程安全的。
後續還會有詳細講解 通用接口--IRichBolt,基本接口-- IBasicBolt ,元組發射類--OutputCollector以及數據流的流轉。
一個拓撲中典型的一步就是爲每一個bolt指明接受哪一種流做爲輸入。 stream grouping(流羣組)定義了流在bolt 任務中如何被劃分。
Storm 中有8種內置流羣組,也能夠經過實現CustomStreamGrouping接口自定義一個流羣組。
後面會有詳細講解,使用TopologyBuilder這個類構建一個拓撲,
storm保證了每一個spout發送的元組都會被成功執行,它會跟蹤從每一個spout發送元組觸發的消息樹,當每一個元組被徹底處理完畢纔算完成,每一個拓撲均有一個消息超時,若是在這個時間內,這個拓撲有一個spout元組未被處理完畢,隨後storm都會從新發送這個元組。
利用storm高可用性能,當一個元組有新的元素加入和成功處理了一個有效元組時告訴storm,bolt中調用emit方法發送消息後,經過OutputCollector對象的ack方法確保消息處理完成。
後續博文會詳細的解釋 storm可靠性工做原理。
每一個spout或者bolt 都在集羣任務中執行,每一個任務對應着一個線程,storm集羣控制如何發送一個任務組到另一個任務組,經過TopologyBuilder的setSpout 和setBolt方法設置Spout 和Bolt的並行性。
拓撲在一個或多個工做進程之間執行。每一個工做進程是一個物理JVM,用於執行拓撲中任務的一部分,好比,有300個並行拓撲而且分配了50個工做進程,每一個工做進程將會執行6個任務,storm會盡可能均勻的分配到工做進程中。能夠經過Config.TOPOLOGY_WORKERS 這個配置設置工做進程數執行拓撲。