storm 架構和原理

mcxiaoracle發表於2022-07-09
  1. Storm 是一個 分散式 的,可靠的,容錯的資料流處理系統

    storm中伺服器節點分為主節點和從節點,Nimbus為主節點和 Supervisor 為從節點。以及若干元件構成。下面為對一些術語進行簡單的介紹: 

    Nimbus:主節點,是一個排程中心,負責分發任務 

    Supervisor:從節點,任務執行的地方 

  2. Worker:任務工作程式,一個Supervisor中可以有多個Worker。 

  3. Executor:Worker程式在執行任務時,會啟動多個Executor執行緒 

     4. Topology:任務的抽象概念。由於storm是流式計算的框架,它的資料流和拓撲圖很像,所以它的任務就叫topology。

Spout:從資料來源獲取資料並進行分發。 

Bolt:得到Spout或者上一個Bolt的資料,然後進行處理後交給下一個Bolt處理。

Tuple:在storm中,一條資料可以理解為是一個Tuple。

二、storm的 架構

任務提交處理流程

當客戶端向storm叢集提交一個Topology時,這裡的提交就是在叢集上透過命令 storm jar xxx啟動topology。如果我們是在Supervisor節點上執行 storm jar xxx,那麼Supervisor會將jar包複製到Nimbus,之後Nimbus對Topology進行排程。

Nimbus會根據Topology所需要的Worker進行分配,將其分配到各個Supervisor的節點上執行。

topology提交流程圖



 

storm中的資料流

啟動完Topology後,相關元件就開始執行起來了。在Storm中,Spout元件主要用來從資料來源拉取資料,形成一個Tuple後轉交給Bolt處理。Bolt接受到Tuple處理完後,可以選擇繼續交給下一個Bolt處理,也可以選擇不往下傳。這樣資料以Tuple的形式一個接一個的往下執行,就形成了一個拓撲資料流。

storm資料在元件間的流向如下圖所示: 

storm資料流


三、Storm的併發度

在Storm中,Worker不是元件執行的最小單位。Executor才是,Executor可以理解為是一個執行緒。我們在建立topology的時候,可以設定執行spout的執行緒數和bolt的執行緒數。

假設spout和bolt的執行緒數加起來設定了8個,然後設定了2個worker,那麼這8個執行緒可能就會隨機分配到2個worker中,可能一個worker3個,一個worker5個。也有可能各自分配4個。如下圖所示: 

四、資料的Grouping策略

在實際應用中,Bolt元件的例項可能有多個,Tuple在流向Bolt時,選擇哪個Bolt例項的策略就是grouping策略。 

下面是Storm中的6種Grouping策略: 

1. Shuffle Grouping: 隨機分組, 隨機派發stream裡面的tuple, 保證每個bolt接收到的tuple數目相同。輪詢,平均分配。 

2. Fields Grouping:按欄位分組, 比如按userid來分組, 具有同樣userid的tuple會被分到相同的Bolts, 而不同的userid則會被分配到不同的Bolts。 

3. All Grouping: 廣播傳送, 對於每一個tuple, 所有的Bolts都會收到。 

4. Global Grouping: 全域性分組, 這個tuple被分配到storm中的一個bolt的其中一個task。再具體一點就是分配給id值最低的那個task。 

5. Non Grouping: 不分組, 這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和Shuffle grouping是一樣的效果,不平均分配。 

6. Direct Grouping: 直接分組, 這是一種比較特別的分組方法,用這種分組意味著訊息的傳送者舉鼎由訊息接收者的哪個task處理這個訊息。 只有被宣告為Direct Stream的訊息流可以宣告這種分組方法。而且這種訊息tuple必須使用emitDirect方法來發射。訊息處理者可以透過TopologyContext來或者處理它的訊息的taskid(OutputCollector.emit方法也會返回taskid)


五、訊息的可靠性保證 —— ack機制

一條資料在Spout中形成一個Tuple,然後交給一個個Bolt執行,那我們怎麼保證這個Tuple被完整的執行了呢?這裡的完整執行說的是這個Tuple必須在後面的每一個Bolt都成功處理,假設在一個Bolt中發生異常導致失敗,這就不能算完整處理。

為了保證訊息處理過程中的可靠性,storm使用了ack機制。storm會專門啟動若干acker執行緒,來追蹤tuple的處理過程。acker執行緒數量可以設定。

每一個Tuple在Spout中生成的時候,都會分配到一個64位的messageId。透過對messageId進行雜湊我們可以執行要對哪個acker執行緒傳送訊息來通知它監聽這個Tuple。


acker執行緒收到訊息後,會將發出訊息的Spout和那個messageId繫結起來。然後開始跟蹤該tuple的處理流程。如果這個tuple全部都處理完,那麼acker執行緒就會呼叫發起這個tuple的那個spout例項的ack()方法。如果超過一定時間這個tuple還沒處理完,那麼acker執行緒就會呼叫對應spout的fail()方法,通知spout訊息處理失敗。spout元件就可以重新傳送這個tuple。


六、Storm的HA保證——高可用性保證

1. 資料方面的高可用

使用ack機制保證資料處理的高可用

Supervisor會自動重啟worker執行緒。

3. Supervisor節點失效了怎麼辦?

可以在其他節點重啟該supervisor任務。

4. Nimbus掛了怎麼辦?

推薦閱讀:

https://blog.csdn.net/qq_18769269/article/details/100191788






























 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69949806/viewspace-2905016/,如需轉載,請註明出處,否則將追究法律責任。

相關文章