談一談Storm(分佈式計算系統)的那些事

面向面試的博客,以問答式Q/A方式呈現。


Question1:簡要介紹一下 Storm ?

Answer1:

Storm 是一個免費並開源的分佈式實時計算系統。利用 Storm 可以很容易做到可靠地處理無限的數據流,像 Hadoop 批量處理大數據一樣,Storm 可以實時處理數據。

Storm集羣架構,如下圖所示:

在這裏插入圖片描述
對於上圖的解釋:

1、Nimbus (作爲master,職能:將代碼分發給Supervisor)
Storm 集羣的 Master 節點,負責分發用戶代碼,指派給具體的 Supervisor 節點上的 Worker 節點,去運行 Topology 對應的組件(Spout/Bolt)的 Task。

2、Supervisor (作爲slave,職能:管理 Worker進程的啓動和終止 )
Storm 集羣的從節點,負責管理運行在 Supervisor 節點上的每一個 Worker 進程的啓動和終止。通過 Storm 的配置文件中的 supervisor.slots.ports 配置項,可以指定在一個 Supervisor 上最大允許多少個 Slot,每個 Slot 通過端口號來唯一標識,一個端口號對應一個 Worker 進程(如果該Worker 進程被啓動)。

3、Worker ( 具體處理組件邏輯的進程 )
運行具體處理組件邏輯的進程。Worker 運行的任務類型只有兩種,一種是 Spout 任務,一種是Bolt 任務。

4、Task
worker中每一個spout/bolt的線程稱爲一個task. 在storm0.8之後,task不再與物理線程對應,不同 spout/bolt 的 task 可能會共享一個物理線程,該線程稱爲 executor。

5、ZooKeeper
用來協調 Nimbus 和 Supervisor,如果 Supervisor 因故障出現問題而無法運行 Topology,Nimbus 會第一時間感知到,並重新分配 Topology 到其它可用的 Supervisor 上運行。


Question2:談一談 Storm編程模型 ( spout->tuple->bolt )?

Answer2:

strom 在運行中可分爲 spout 與 bolt 兩個組件,其中,數據源從 spout 開始,數據以 tuple 的方式發送到 bolt,多個 bolt 可以串連起來,一個 bolt 也可以接入多個 spot/bolt。

整個運行時原理如下圖:

在這裏插入圖片描述
對上圖主要概念的解釋:

1、Topology
Storm 中運行的一個實時應用程序的名稱。將 Spout、 Bolt 整合起來的拓撲圖。定義了 Spout 和Bolt 的結合關係、併發數量、配置等等。

2、Spout
在一個 topology 中獲取源數據流的組件。通常情況下 spout 會從外部數據源中讀取數據,然後轉換爲 topology 內部的源數據。

3、Bolt
接受數據然後執行處理的組件,用戶可以在其中執行自己想要的操作。

4、Tuple
一次消息傳遞的基本單元,理解爲一組消息就是一個 Tuple。

5、Stream
Tuple 的集合。表示數據的流向。


Question3:談一談 Topology的運行 ?

Answer3:

在 Storm 中,一個實時應用的計算任務被打包作爲 Topology 發佈,這同 Hadoop MapReduce 任務相似。但是有一點不同的是:在 Hadoop 中,MapReduce 任務最終會執行完成後結束;而在Storm 中,Topology 任務一旦提交後永遠不會結束,除非你顯示去停止任務。計算任務Topology 是由不同的 Spouts 和 Bolts,通過數據流(Stream)連接起來的圖。一個 Storm 在集羣上運行一個 Topology 時,主要通過以下 3 個實體來完成 Topology 的執行工作:

(1). Worker (進程)
(2). Executor (線程)
(3). Task
在這裏插入圖片描述

1、Worker( 1 個 worker 進程執行的是 1 個 topology 的子集 )
1 個 worker 進程執行的是 1 個 topology 的子集(注:不會出現 1 個 worker 爲多個 topology服務)。1 個 worker 進程會啓動 1 個或多個 executor 線程來執行 1 個 topology 的component(spout 或 bolt)。因此,1 個運行中的 topology 就是由集羣中多臺物理機上的多個worker 進程組成的。

2、Executor( executor 是 1 個被 worker 進程啓動的單獨線程 )
Executor 是 1 個被 worker 進程啓動的單獨線程。每個 executor 只會運行 1 個 topology 的 1 個component(spout 或 bolt)的 task(注:task 可以是 1 個或多個,storm 默認是 1 個component 只生成 1 個 task,executor 線程裏會在每次循環裏順序調用所有 task 實例)。

3、Task( 最終運行 spout 或 bolt 中代碼的單元 )
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。

在這裏插入圖片描述


Question4:談一談 Storm Streaming Grouping ?

Answer4:

Stream grouping 是 Storm 中最重要的抽象了,它能夠控制 Spot/Bolt 對應的 Task 以什麼樣的方式來分發 Tuple,將 Tuple 發射到目的 Spot/Bolt 對應的 Task。
在這裏插入圖片描述
目前,Storm Streaming Grouping 支持如下幾種類型:

1、huffle Grouping
隨機分組,儘量均勻分佈到下游 Bolt 中將流分組定義爲混排。這種混排分組意味着來自 Spout 的輸入將混排,或隨機分發給此 Bolt 中的任務。shuffle grouping 對各個 task 的 tuple 分配的比較均勻。

2、Fields Grouping
按字段分組,按數據中 field 值進行分組;相同 field 值的 Tuple 被髮送到相同的 Task 這種grouping 機制保證相同 field 值的 tuple 會去同一個 task。

3、All grouping :廣播
廣播發送, 對於每一個 tuple 將會複製到每一個 bolt 中處理。

4、Global grouping
全局分組,Tuple 被分配到一個 Bolt 中的一個 Task,實現事務性的 Topology。Stream 中的所有的 tuple 都會發送給同一個 bolt 任務處理,所有的 tuple 將會發送給擁有最小 task_id 的 bolt任務處理。

5、None grouping :不分組
不關注並行處理負載均衡策略時使用該方式,目前等同於 shuffle grouping,另外 storm 將會把bolt 任務和他的上游提供數據的任務安排在同一個線程下。

6、Direct grouping :直接分組 指定分組
由 tuple 的發射單元直接決定 tuple 將發射給那個 bolt,一般情況下是由接收 tuple 的 bolt 決定接收哪個 bolt 發射的 Tuple。這是一種比較特別的分組方法,用這種分組意味着消息的發送者指定由消息接收者的哪個 task 處理這個消息。 只有被聲明爲 Direct Stream 的消息流可以聲明這種分組方法。而且這種消息 tuple 必須使用 emitDirect 方法來發射。消息處理者可以通過TopologyContext 來獲取處理它的消息的 taskid (OutputCollector.emit 方法也會返回taskid)。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章