storm從入門到放棄教程(2)--基礎概念詳細介紹

概述

上一篇【storm初識】 博文鏈接:https://my.oschina.net/u/2342969/blog/871432數據庫

     本文將對storm的概念進行解釋和進一步闡述,將要講解的概念有:數組

  1. Topologies (拓撲)
  2. Streams (數據流)
  3. Spouts (發射器,瀑布)
  4. Bolts ( 閃電 ,處理者)
  5. Stream groupings (流羣組)
  6. Reliability (可靠性)
  7. Tasks (任務)
  8. Workers (角色,工做者)

名詞解釋

Topologies (拓撲)

     topologies是實時處理計算的程序邏輯的程序包,一個topologies相似於一個 MapReduce  任務,MapReduce  任務是最終完成,而一個拓撲能夠永遠運行(只到你殺死它爲止)。一個topologies是Spouts和Bolts 在storm集羣中鏈接關係結構圖。安全

      後續還會有詳細的在生產以及本地部署、測試、提交Topologies學習和介紹。請你們多多關注!!!負載均衡

Streams (數據流)

    Streams是storm中一個核心的概念,它是在分佈式並行處理和建立的無限序列元組,Streams經過給流元組中字段命名來定義,默認狀況下,元組能夠包含整型,長整型,短整型,字節,字符串,布爾型,雙精度浮點型,單精度浮點型,字節數組,也能夠自定義序列化類型。異步

     聲明任何一個stream須要給定一個ID(非必須),單一stream,一個Spouts對應一個Bolts也是很常見。「OutputFieldsDeclarer」 接口爲聲明沒有指定id的stream提供個簡便的方法,這種狀況下,stream會有一個名稱爲「 "default"  的默認id。流是有元組組成。分佈式

     後續還會有詳細講解 Tuple(元組),OutputFieldsDeclarer,元組中動態類型以及自定義序列化,請多多關注!!!wordpress

Spouts (發射器,瀑布)

    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能夠作過濾,功能,計算,合併,數據庫交互等等處理元組的操做。

    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以及數據流的流轉。

Stream groupings (流羣組)

     一個拓撲中典型的一步就是爲每一個bolt指明接受哪一種流做爲輸入。 stream grouping(流羣組)定義了流在bolt 任務中如何被劃分。

     Storm  中有8種內置流羣組,也能夠經過實現CustomStreamGrouping接口自定義一個流羣組。

  1. 隨機分組:元組隨機的分佈到各個bolt任務中,保證每一個bolt處理同等數量的元組。
  2. 字段分組:根據指定字段對數據流切割分組,好比,在數據流中根據「user-id」字段分組,具備相同「user-id」字段的元組會被分到同一個任務中,不一樣於「user-id」字段的元組會被分到其餘任務中。
  3. 側重分組:和字段分組分組相似,根據指定字段對數據流分組,不一樣的是,它對下游的bolt作了負載均衡,當傳入的數據傾斜時(不均衡),它能夠更好的利用資源,這個文檔很好的解釋了它是如何更好的工做的。若有須要另起一篇關於它的詳細工做原理的,能夠經過評論提出。
  4. 全分組:數據流將分配到全部bolt的任務中,這個分組慎用。
  5. 全局分組:全部的流被分配到bolt其中一個任務,特別之處,它會分配到ID最小的bolt。
  6. 無分組:這種分組就是不用關心數據流是如何分組的,通常來講,無分組至關於隨機分組,不過, Storm  將會在同一個線程中推送無分組的bolt給訂閱了的bolt或者spout。
  7. 直接分組:這是一種特殊的分組,採用這種方式意味着,元組生產者直接決定了哪一個元組消費者直接接收。該分組只能被定義爲直接流的所使用,元組發送只能使用emitDirect方法,bolt能夠經過提供的TopologyContext或者OutputCollector的emit方法的輸出流(元組發送完畢後返回任務id)獲得任務id.
  8. 本地 或 隨機分組:若是目標bolt在同一個工做進程內有一個或多個任務時,元組會打亂工做進程內的任務,這機制就像一個正常的隨機分組似的。

後面會有詳細講解,使用TopologyBuilder這個類構建一個拓撲,

   Reliability (可靠性)

     storm保證了每一個spout發送的元組都會被成功執行,它會跟蹤從每一個spout發送元組觸發的消息樹,當每一個元組被徹底處理完畢纔算完成,每一個拓撲均有一個消息超時,若是在這個時間內,這個拓撲有一個spout元組未被處理完畢,隨後storm都會從新發送這個元組。

       利用storm高可用性能,當一個元組有新的元素加入和成功處理了一個有效元組時告訴storm,bolt中調用emit方法發送消息後,經過OutputCollector對象的ack方法確保消息處理完成。

後續博文會詳細的解釋 storm可靠性工做原理。

Tasks (任務)

     每一個spout或者bolt 都在集羣任務中執行,每一個任務對應着一個線程,storm集羣控制如何發送一個任務組到另一個任務組,經過TopologyBuilder的setSpout 和setBolt方法設置Spout 和Bolt的並行性。

Workers (角色,工做者)

     拓撲在一個或多個工做進程之間執行。每一個工做進程是一個物理JVM,用於執行拓撲中任務的一部分,好比,有300個並行拓撲而且分配了50個工做進程,每一個工做進程將會執行6個任務,storm會盡可能均勻的分配到工做進程中。能夠經過Config.TOPOLOGY_WORKERS 這個配置設置工做進程數執行拓撲。

相關文章
相關標籤/搜索