Storm 並行度分配原理及最佳化

破棉襖發表於2014-09-04

ps:都是學習的別人的部落格,只是做了個整理所有就寫成了原創,其實都是人家的東西


  當一個topology在storm cluster中執行時,它的併發主要跟3個邏輯物件相關:worker,executor 和task

1. Worker 是執行在工作節點上面,被Supervisor守護程式建立的用來幹活的JVM程式。每個Worker對應於一個給定topology的全部執行任務的一個子集。反過來說,一個Worker裡面不會執行屬於不同的topology的執行任務。

2. Executor可以理解成一個Worker程式中的工作執行緒。一個Executor中只能執行隸屬於同一個component(spout/bolt)的task。一個Worker程式中可以有一個或多個Executor執行緒。在預設情況下,一個Executor執行一個task。

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數量


任務分配時有兩種情況:


 (a)task數目比worker多,例如task是[1 2 3 4],可用的slot只有[host1:port1 host2:port1],那麼最終是這樣分配
{1: [host1:port1] 2 : [host2:port1]
         3 : [host1:port1] 4 : [host2:port1]}
可以看到任務平均地分配在兩個worker上。

(b)如果task數目比worker少,例如task是[1 2],而worker有[host1:port1 host1:port2 host2:port1 host2:port2],那麼首先會將woker排序,將不同host間隔排列,保證task不會全部分配到同一個機器上,也就是將worker排列成
[host1:port1 host2:port1 host1:port2 host2:port2]
 然後分配任務為
{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個左右, 當然這個參考, 實際情況還是要根據配置和測試情況 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1263921/,如需轉載,請註明出處,否則將追究法律責任。

相關文章