Storm中Task數的設置與計算(1.0.1版本)
==思考問題1==
向集群提交一個拓撲的時候,Storm是如何計算Task數以及Executor數的?
==思考問題2:==
構建拓撲的時候,有3個地方會影響task數,這3個地方之間有什麽關系?
builder.setSpout("spout", new RandomSentenceSpout(), 5); //parallelism-hint builder.setSpout("spout", new RandomSentenceSpout(), 5).setNumTask(1); builder.setSpout("spout", new RandomSentenceSpout(), 5).setNumTasks(1).setMaxTaskParallelism(1);
==關於Task數的計算==
storm的拓撲分配的是在nimbus.clj中完成的。
代碼路徑:org/apache/storm/daemon/nimbus.clj
函數名稱:mk-assignments
在整個處理過程中,有一個函數非常重要,看了之後上面的3個關系多少會清晰很多。
這個代碼是用clojure語言編寫的,沒有用過的人多少看起來會費勁,如果用普通的java來寫,大概思路是這個樣子的
num-tasks = (TOPOLOGY-TASKS == null ? TOPOLOGY-TASKS : parallelism-hint) max-parallelism = TOPOLOGY-MAX-TASK-PARALLELISMif (max-parallelism != null) { if (max-parallelism < num-tasks) { task數= max-parallelism } else { task數= num-tasks } } else { task數= num-tasks }
如果將3個參數進行排列組合之後,獲得結果如下:
==關於executor數的來源==
下圖是一個從其他博客剪切過來的圖片,可以看出:executor數是從我們的拓撲中取得的。
啟動的時候,會將所有component的parallelism-hint累加,形成我們大家熟知的“並行度”。
可但是,但可是,我在查看setNumTasks函數的源碼註釋的時候,可以看出來一個信息
紅線部分的直譯(英文不好,翻譯的可能不準確):
在整個拓撲結構的生命周期內,Spout/Bolt的任務數總是相同的,但是Spout/Bolt的執行器executors(線程)的數量可以隨著時間而變化。
那麽,問題來了,什麽時候executor的數量會變化呢?我能想到的至少有一種場景吧。
使用storm rebalance命令,來動態調整拓撲“並行度”的時候,executor的數量是一定會變化的。
rebalance命令的參數如下所示:
==簡單總結==
1、有3個地方可以影響Task數,根據3個參數的結果決定Task數。
2、executor數 = 所有組件的parallelism-hint總數。
3、task數在生命周期內不變,executor數可能改變。
-------------
參考博客:
https://www.cnblogs.com/ierbar0604/p/4386480.html
http://lib.csdn.net/article/60/42875
Storm中Task數的設置與計算(1.0.1版本)