Storm 基本概念

2021-10-10 15:47:45 字數 3378 閱讀 1341

storm 是乙個免費並開源的分布式實時計算系統。利用storm 可以很容易做到可靠地處理無限的資料流,像hadoop 批量處理大資料一樣,storm 可以實時處理資料。

storm 集群的master 節點,負責分發使用者**,指派給具體的supervisor 節點上的worker 節點,去執行topology 對應的元件(spout/bolt)的task。

storm 集群的從節點,負責管理執行在supervisor 節點上的每乙個worker 程序的啟動和終止。通過storm 的配置檔案中的supervisor.slots.ports 配置項,可以指定在乙個supervisor 上最大允許多少個slot,每個slot 通過埠號來唯一標識,乙個埠號對應乙個worker 程序(如果該worker 程序被啟動)。

執行具體處理元件邏輯的程序。worker 執行的任務型別只有兩種,一種是spout 任務,一種是bolt 任務。

worker 中每乙個spout/bolt 的執行緒稱為乙個task. 在storm0.8 之後,task 不再與物理執行緒對應,不同spout/bolt 的task 可能會共享乙個物理執行緒,該執行緒稱為executor。

用來協調nimbus 和supervisor,如果supervisor 因故障出現問題而無法執行topology,nimbus 會第一時間感知到,並重新分配topology 到其它可用的supervisor 上執行。

strom 在執行中可分為spout 與bolt 兩個元件,其中,資料來源從spout 開始,資料以tuple 的方式傳送到bolt,多個bolt 可以串連起來,乙個bolt 也可以接入多個spot/bolt.執行時原理如下圖。

storm 中執行的乙個實時應用程式的名稱。將 spout、 bolt 整合起來的拓撲圖。定義了 spout 和bolt 的結合關係、併發數量、配置等等。

在乙個topology 中獲取源資料流的元件。通常情況下spout 會從外部資料來源中讀取資料,然後轉換為topology 內部的源資料。

接受資料然後執行處理的元件,使用者可以在其中執行自己想要的操作。

一次訊息傳遞的基本單元,理解為一組訊息就是乙個tuple。

tuple 的集合。表示資料的流向。

在storm 中,乙個實時應用的計算任務被打包作為topology 發布,這同hadoop mapreduce任務相似。但是有一點不同的是:在hadoop 中,mapreduce 任務最終會執行完成後結束;而在storm 中,topology 任務一旦提交後永遠不會結束,除非你顯示去停止任務。計算任務topology 是由不同的spouts 和bolts,通過資料流(stream)連線起來的圖。乙個storm 在集群上執行乙個topology 時,主要通過以下3 個實體來完成topology 的執行工作。包括worker(程序)、executor(執行緒)、task。

1 個worker 程序執行的是1 個topology 的子集(注:不會出現1 個worker 為多個topology服務)。1 個worker 程序會啟動1 個或多個executor 執行緒來執行1 個topology 的component(spout 或bolt)。因此,1 個執行中的topology 就是由集群中多台物理機上的多個worker 程序組成的。

executor 是1 個被worker 程序啟動的單獨執行緒。每個executor 只會執行1 個topology 的1 個component(spout 或bolt)的task(注:task 可以是1 個或多個,storm 預設是1 個component 只生成1 個task,executor 執行緒裡會在每次迴圈裡順序呼叫所有task 例項)。

task是最終執行spout 或bolt 中**的單元(注:1 個task 即為spout 或bolt 的1 個例項,executor 執行緒在執行期間會呼叫該task 的nexttuple 或execute 方法)。topology 啟動後,1個component(spout 或bolt)的task 數目是固定不變的,但該component 使用的executor 執行緒數可以動態調整(例如:1 個executor 執行緒可以執行該component 的1 個或多個task 實

例)。這意味著,對於1 個component 存在這樣的條件:#threads<=#tasks(即:執行緒數小於等於task 數目)。預設情況下task 的數目等於executor 執行緒數目,即1 個executor 執行緒只執行1 個task。

storm 中最重要的抽象,應該就是stream grouping 了,它能夠控制spot/bolt 對應的task 以什麼樣的方式來分發tuple,將tuple 發射到目的spot/bolt 對應的task。

目前,storm streaming grouping 支援如下幾種型別。

隨機分組,盡量均勻分布到下游bolt 中將流分組定義為混排。這種混排分組意味著來自spout 的輸入將混排,或隨機分發給此bolt 中的任務。shuffle grouping 對各個task 的tuple 分配的比較均勻。

按欄位分組,按資料中field 值進行分組;相同field 值的tuple 被傳送到相同的task 這種grouping 機制保證相同field 值的tuple 會去同乙個task。

廣播傳送, 對於每乙個tuple 將會複製到每乙個bolt 中處理。

全域性分組,tuple 被分配到乙個bolt 中的乙個task,實現事務性的topology。stream 中的所有的tuple 都會傳送給同乙個bolt 任務處理,所有的tuple 將會傳送給擁有最小task_id 的bolt任務處理。

不關注並行處理負載均衡策略時使用該方式,目前等同於shuffle grouping,另外storm 將會把bolt 任務和他的上游提供資料的任務安排在同乙個執行緒下。

由tuple 的發射單元直接決定tuple 將發射給那個bolt,一般情況下是由接收tuple 的bolt 決定接收哪個bolt 發射的tuple。這是一種比較特別的分組方法,用這種分組意味著訊息的傳送者指定由訊息接收者的哪個task 處理這個訊息。 只有被宣告為direct stream 的訊息流可以宣告這種分組方法。而且這種訊息tuple 必須使用emitdirect 方法來發射。訊息處理者可以通過topologycontext 來獲取處理它的訊息的taskid (outputcollector.emit 方法也會返回taskid)。

Storm基本概念

原文 寫在前面的話 請允許我廢話幾句。這個系列的文章發布的時間是在我完成了storm的專案開發之後才找出來時間寫的,在研究storm過程中,國內較好的參考文章實在有限,大多是入門和概念剖析。storm的googlegroup對於新手來說實在不友好。有經驗人士都不願意回答新手的一些 愚蠢 的問題。現在...

Storm基本概念

storm為分布式實時計算提供了一組通用原語,可被用於 流處理 之中,實時處理訊息並更新資料庫。這是管理佇列及工作者集群的另一種方式。storm也可被用於 連續計算 continuous computation 對資料流做連續查詢,在計算時就將結果以流的形式輸出給使用者。它還可被用於 分布式rpc ...

Storm系列之 基本概念

寫在前面的話 請允許我廢話幾句。這個系列的文章發布的時間是在我完成了storm的專案開發之後才找出來時間寫的,在研究storm過程中,國內較好的參考文章實在有限,大多是入門和概念剖析。storm的googlegroup對於新手來說實在不友好。有經驗人士都不願意回答新手的一些 愚蠢 的問題。現在因為s...