天天看點

Storm 配置設定邏輯

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個左右, 當然這個參考, 實際情況還是要根據配置和測試情況 

繼續閱讀