1. 程式人生 > >Storm中Task數的設置與計算(1.0.1版本)

Storm中Task數的設置與計算(1.0.1版本)

null 英文 如果 之間 one 很多 ask 其他 tar

==思考問題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-PARALLELISM    
    
if (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版本)