當一個topology在storm cluster中運行時,它的併發主要跟3個邏輯對象相關:worker,executor 和task併發
1. Worker 是運行在工做節點上面,被Supervisor守護進程建立的用來幹活的JVM進程。每一個Worker對應於一個給定topology的所有執行任務的一個子集。反過來講,一個Worker裏面不會運行屬於不一樣的topology的執行任務。app
2. Executor能夠理解成一個Worker進程中的工做線程。一個Executor中只能運行隸屬於同一個component(spout/bolt)的task。一個Worker進程中能夠有一個或多個Executor線程。在默認狀況下,一個Executor運行一個task。dom
3. Task則是spout和bolt中具體要乾的活了。一個Executor能夠負責1個或多個task。每一個component(spout/bolt)的併發度就是這個component對應的task數量。同時,task也是各個節點之間進行grouping(partition)的單位。測試
conf.setNumWorkers(workers); //設置worker數量
uilder.setBolt("2", new WordSpliter(),4) //設置Executor併發數量
builder.setBolt("2", new WordSpliter(),4).setNumTasks(1); //設置每一個線程處理的Task數量
任務分配時有兩種狀況:ui
(a)task數目比worker多,例如task是[1 2 3 4],可用的slot只有[host1:port1 host2:port1],那麼最終是這樣分配google
{1: [host1:port1] 2 : [host2:port1]
3 : [host1:port1] 4 : [host2:port1]}spa
能夠看到任務平均地分配在兩個worker上。
(b)若是task數目比worker少,例如task是[1 2],而worker有[host1:port1 host1:port2 host2:port1 host2:port2],那麼首先會將woker排序,將不一樣host間隔排列,保證task不會所有分配到同一個機器上,也就是將worker排列成.net
[host1:port1 host2:port1 host1:port2 host2:port2]線程
而後分配任務爲component
{1: host1:port1 , 2 : host2:port1}
經過Config.setNumWorkers(int))來指定一個storm集羣中執行topolgy的進程數量, 全部的線程將在這些指定的worker進程中運行. 好比說一個topology中要啓動300個線程來運行spout/bolt, 而指定的worker進程數量是60個, 那麼storm將會給每一個worker分配5個線程來跑spout/bolt, 若是要對一個topology進行調優, 能夠調整worker數量和spout/bolt的parallelism數量(調整參數以後要記得從新部署topology. 後續會爲該操做提供一個swapping的功能來減少從新部署的時間).
對於worker和task之間的比例, nathan也給出了參考, 即1個worker包含10~15個左右, 固然這個參考, 實際狀況仍是要根據配置和測試狀況
實際上woker的實際運行數量受限於setworker配置和supervisor.slots.ports兩個配置
--------------------- 本文來自 random-walk 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/asdfsadfasdfsa/article/details/59057609?utm_source=copy