閱讀516 返回首頁    go 技術社區[雲棲]


Apache Storm 官方文檔 —— 理解 Storm 拓撲的並行度(parallelism)概念

一個運行中的拓撲是由什麼構成的:工作進程(worker processes),執行器(executors)和任務(tasks)

在一個 Storm 集群中,Storm 主要通過以下三個部件來運行拓撲:

  1. 工作進程(worker processes)
  2. 執行器(executors)
  3. 任務(tasks)

下麵是他們之間相互關係的簡單圖示。

relationship

在 Worker 中運行的是拓撲的一個子集。一個 worker 進程是從屬於某一個特定的拓撲的,在 worker 進程中會運行一個或者多個與拓撲中的組件相關聯的 executor。一個運行中的拓撲就是由這些運行於 Storm 集群中的很多機器上的進程組成的。

一個 executor 是由 worker 進程生成的一個線程。在 executor 中可能會有一個或者多個 task,這些 task 都是為同一個組件(spout 或者 bolt)服務的。

task 是實際執行數據處理的最小工作單元(注意,task 並不是線程) —— 在你的代碼中實現的每個 spout 或者 bolt 都會在集群中運行很多個 task。在拓撲的整個生命周期中每個組件的 task 數量都是保持不變的,不過每個組件的 executor 數量卻是有可能會隨著時間變化。在默認情況下 task 的數量是和 executor 的數量一樣的,也就是說,默認情況下 Storm 會在每個線程上運行一個 task。

配置拓撲的並行度(parallelism)

注意,這裏所說的術語“並行度”主要是用於表示所謂的 parallelism_hint,它代表著一個組件的初始 executor (也是線程)數量。在這篇文章裏,我們使用這個“並行度”術語來說明在 Storm 拓撲中既可以配置 executor 的數量,也可以配置 worker 和 task 的數量。如果“並行度”的概念需要表示其他的一般情況,我們也會特別指出。

下麵的內容裏顯示了很多可配置選項,以及在代碼中配置他們的方法。可以用於配置的方法有很多種,這裏列出的隻是其中一部分。另外需要注意的是,Storm 的配置優先級為 defaults.yaml < storm.yaml < 拓撲配置 < 內置型組件信息配置 < 外置型組件信息配置。

Worker 數量

Executors(線程)數量

  • 說明:每個組件需要的執行線程數
  • 配置選項:(沒有拓撲級的通用配置項)
  • 在代碼中如何使用(示例):

Tasks 數量

以下是配置上述參數的一個簡單示例代碼:

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
               .setNumTasks(4)
               .shuffleGrouping("blue-spout);

在上麵的代碼中,我們為 GreenBolt 配置了 2 個初始執行線程(executor)和 4 個關聯任務(task)。這樣,每個執行線程中會運行 2 個任務。如果你在設置 bolt 的時候不指定 task 的數量,那麼每個 executor 的 task 數會默認設置為 1。

拓撲示例

下圖顯示了一個與實際應用場景很接近的簡單拓撲的結構。這個拓撲由三個組件構成:一個名為 BlueSpout 的 spout,和兩個名為 GreenBolt 和 YellowBolt 的 bolt。這些組件之間的關係是:BlueSpout 將它的輸出發送到 GreenBolt 中,然後GreenBolt 將消息繼續發送到 YellowBolt 中。

running-topology

圖中是一個包含有兩個 worker 進程的拓撲。其中,藍色的 BlueSpout 有兩個 executor,每個 executor 中有一個 task,並行度為 2;綠色的 GreenBolt 有兩個 executor,每個 executor 有兩個 task,並行度也為2;而黃色的YellowBolt 有 6 個 executor,每個 executor 中有一個 task,並行度為 6,因此,這個拓撲的總並行度就是 2 + 2 + 6 = 10。具體分配到每個 worker 就有 10 / 2 = 5 個 executor。

上圖中,GreenBolt 配置了 task 數,而 BlueSpout 和 YellowBolt 僅僅配置了 executor 數。下麵是相關代碼:

Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes

topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
               .setNumTasks(4)
               .shuffleGrouping("blue-spout");

topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
               .shuffleGrouping("green-bolt");

StormSubmitter.submitTopology(
        "mytopology",
        conf,
        topologyBuilder.createTopology()
    );

當然,Storm 還有一些其他的配置項可以控製拓撲的並行度,包括:

如何修改運行中的拓撲的並行度

Storm 的一個很有意思的特點是你可以隨時增加或者減少 worker 或者 executor 的數量,而不需要重啟集群或者拓撲。這個方法就叫做再平衡(rebalance)。

有兩種方法可以對一個拓撲執行再平衡操作:

  1. 使用 Storm UI
  2. 使用以下所示的客戶端(CLI)工具

下麵是使用 CLI 工具的一個簡單示例:

## 重新配置拓撲 "mytopology",使得該拓撲擁有 5 個 worker processes,
## 另外,配置名為 "blue-spout" 的 spout 使用 3 個 executor,
## 配置名為 "yellow-bolt" 的 bolt 使用 10 個 executor。

$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

 

最後更新:2017-05-22 14:34:10

  上一篇:go  深入理解 sudo 與 su 之間的區別
  下一篇:go  《Java並發編程的藝術》源碼下載