Storm 並行度分配原理及優化

當一個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

相關文章
相關標籤/搜索