516
技術社區[雲棲]
Apache Storm 官方文檔 —— 理解 Storm 拓撲的並行度(parallelism)概念
一個運行中的拓撲是由什麼構成的:工作進程(worker processes),執行器(executors)和任務(tasks)
在一個 Storm 集群中,Storm 主要通過以下三個部件來運行拓撲:
- 工作進程(worker processes)
- 執行器(executors)
- 任務(tasks)
下麵是他們之間相互關係的簡單圖示。
在 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 數量
- 說明:拓撲在集群中運行所需要的工作進程數
- 配置選項:TOPOLOGY_WORKERS
- 在代碼中如何使用(示例):
Executors(線程)數量
- 說明:每個組件需要的執行線程數
- 配置選項:(沒有拓撲級的通用配置項)
- 在代碼中如何使用(示例):
- TopologyBuilder#setSpout()
- TopologyBuilder#setBolt()
- 注意:從 Storm 0.8 開始
parallelism_hint
參數代表 executor 的數量,而不是 task 的數量
Tasks 數量
- 說明:每個組件需要的執行任務數
- 配置選項:TOPOLOGY_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
中。
圖中是一個包含有兩個 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 還有一些其他的配置項可以控製拓撲的並行度,包括:
- TOPOLOGY_MAX_TASK_PARALLELISM:該選項設置了一個組件最多能夠分配的 executor 數(線程數上限),一般用於在本地模式運行拓撲時測試分配線程的數量限製。你可以通過 Config#setMaxTaskParallelism() 來配置該參數。
如何修改運行中的拓撲的並行度
Storm 的一個很有意思的特點是你可以隨時增加或者減少 worker 或者 executor 的數量,而不需要重啟集群或者拓撲。這個方法就叫做再平衡(rebalance)。
有兩種方法可以對一個拓撲執行再平衡操作:
- 使用 Storm UI
- 使用以下所示的客戶端(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
上一篇:
深入理解 sudo 與 su 之間的區別
下一篇:
《Java並發編程的藝術》源碼下載
LAndroid LayerDrawable層疊樣式layer-list
C# 怎麼檢測string字符串中有哪些數字?
山西省醫院協會牽手科大訊飛 依托省人民醫院推進 “ AI + 醫療”落地
BitmapFactory.Options.inSampleSize 的用法
Cocos2d-x 3.0 新特性體驗- 回調函數的變化
C++編程規範之0:不要拘泥於小節
阿裏雲機器學習係列直播--AutoEncoder實現語音降噪 附PAI深度學習完全使用教程【巨額福利-雲棲大會門票】
書單推薦 | 數據挖掘和統計科學自學十大必備讀物
概覽最有前景的下一代嵌入式 Linux 軟件更新機製
《大數據導論》導讀