1. 程式人生 > >storm的並行度

storm的並行度

storm的並行度

是什麼組成了一個執行中的topology:工作程序(worker processes),執行器(executors)和任務(tasks)
在一個 Storm 叢集中,Storm 主要通過以下三個部件來執行拓撲:

工作程序(worker processes)
執行器(executors)執行緒
任務(tasks)

這是官網放出的一個他們之間相互關係的圖:

在這裡插入圖片描述

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

一個 executor 是由 worker 程序生成的一個執行緒。在 executor 中可能會有一個或者多個 task,這些 task 都是為同一個元件(spout 或者 bolt)服務的。預設的是一個executor執行一個task

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

設定storm的並行度

直接看程式碼是如何設定並行度的:

Config conf = new Config();
conf.setNumWorkers(2); // 設定2個work

topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // 設定blue-spout的executors個數

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) // 設定green-bolt的executors個數
               .setNumTasks(4) //設定green-bolt的task個數
               .shuffleGrouping("blue-spout"); //隨機分組

topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6) // 設定yellow-bolt"的executors個數
               .shuffleGrouping("green-bolt"); //隨機分組

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

上面的程式碼設定的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。

由上面的例子我們可以看出一個topology的並行度其實與task沒有實際的聯絡。topology在執行的時候task的數量是已知的不能執行更改,除非重新更改程式碼提交topology,而work和executor是可以動態更改的(rebalance)。
可以通過控制檯更改一個topology的並行度:

## 重新配置拓撲 "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

總結:
worker即程序,一個worker就是一個程序,程序裡面包含一個或多個執行緒,一個執行緒就是一個executor,一個executor會處理一個或多個任務,一個任務就是一個task,一個task就是一個元件類的例項物件,每個 spout 或者 bolt 元件都會在叢集中執行很多個 task。