1 storm並行的基本概念html
一個運行中的拓撲是由什麼構成的:工做進程(worker processes),執行器(executors)和任務(tasks)
在一個 Storm 集羣中,Storm 主要經過如下三個部件來運行拓撲:
工做進程(worker processes)(進程數)
執行器(executors)(線程數)
任務(tasks)(實例組件數)java
storm集羣中的一個機器能夠運行一個或者多個worker,對應於一個或者多個topologies.1個worker進程運行1個或多個 excutor線程。每一個worker從屬於一個topology.executor是單線程。每1個executor運行着相同的組件(spout或 bolt)的1個或多個task。1個task執行着實際的數據處理。apache
下面是他們之間相互關係的簡單圖示。api
2 是否須要提升workers數目併發
(1) 最好 一臺機器上的一個topology只使用一個worker,主要緣由時減小了worker之間的數據傳輸工具
(2) 有更多的worker可能會有更好的表現,這取決於你的瓶頸所在。每一個worker都有經過一個線程將元組轉移到其餘的worker,因此若是你的瓶頸在CPU和每一個worker正在處理大量的元組,更多的worker可能會提升你的吞吐量。測試
因此基本上沒有明確的答案,你應該根據你的環境和設計來嘗試不一樣的配置。ui
3 executor的數目
executor是真正的並行度(事實上的並行度)。(task數目是想要設置的並行度)
executor初始數目=spout數目+bolt數目+acker數目 (這些加起來也就是task數目。)
spout數目,bolt數目,acker數目運行時是不會變化的,可是executor數目能夠變化。spa
4 是否須要提升TASK數目
TASK的存在只是爲了topology擴展的靈活性,與並行度無關。.net
1個task執行着實際的數據處理。
1個worker進程執行一個拓撲的子集。1個worker進程從屬於1個特定的拓撲,並運行着這個拓撲的1個或多個組件(spout或bolt)的1個或多個executor。一個運行中的拓撲包括集羣中的許多臺機器上的許多個這樣的進程。
1個executor是1個worker進程生成的1個線程。它可能運行着1個相同的組件(spout或bolt)的1個或多個task。
1 個task執行着實際的數據處理,你用代碼實現的每個spout或bolt就至關於分佈於整個集羣中的許多個task。在1個拓撲的生命週期中,1個組 件的task的數量老是同樣的,可是1個組件的executor(線程)的數量能夠隨着時間而改變。這意味着下面的條件老是成立:thread的數量 <= task的數量。默認狀況下,task的數量與executor的數量同樣,例如,Storm會在每1個線程運行1個task。
配置拓撲的併發度
注意Storm的術語"併發度(parallelism)"是特別用來描述所謂的parallelism hint的,這表明1個組件的初始的executor(線程)的數量。在此文檔中咱們使用術語"併發度"的通常意義來描述你不但能夠配置executor 的數量,還能夠配置worker進程的數量,還能夠是1個拓撲的task的數量。在用到併發度的狹義的定義時咱們會特別提出。
下面的小節給出了一些不一樣的配置選項,還有你如何在代碼中設置它們。有多種方法能夠進行設置,表格列舉了其中幾種。Storm目前有下列的配置優先級:defaults.yaml < storm.yaml < 特定拓撲的配置 < 內部特定組件的配置 < 外部特定組件的配置。
Worker 數量
說明:拓撲在集羣中運行所須要的工做進程數
配置選項:TOPOLOGY_WORKERS
在代碼中如何使用(示例):
Config#setNumWorkers
Executors(線程)數量
說明:每一個組件須要的執行線程數
配置選項:(沒有拓撲級的通用配置項)
在代碼中如何使用(示例):
TopologyBuilder#setSpout()
注意:從 Storm 0.8 開始 parallelism_hint 參數表明 executor 的數量,而不是 task 的數量
Tasks 數量
說明:每一個組件須要的執行任務數
配置選項:TOPOLOGY_TASKS
在代碼中如何使用(示例):
ComponentConfigurationDeclarer#setNumTasks()
如下是配置上述參數的一個簡單示例代碼:
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 processestopologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2topologyBuilder.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