1. 程式人生 > >storm(四) 並行度

storm(四) 並行度

概念

worker

  • 一個實體機可以執行一個或者多個worker
  • 一個worker只能執行一個topology上的部分或全部component
  • 一個worker是一個獨立的程序
  • 在執行過程中可以調整worker的數量

executor

  • 一個worker中可以執行多個executor
  • 一個executor是一個執行緒
  • 一個executor可以執行一個或者多個task,這些task必須是同一型別
  • executor的數量<=task的數量
  • 預設情況下一個executor中執行一個task
  • executor的數量在topology的執行過程中可以動態調整,storm的並行度調整主要針對的就是executor

task

  • 具體操作資料的bolt或者spout
  • 在整個topology執行狀態中,task的數量是固定的不能改變的

這裡寫圖片描述

並行度調整

調整並行度有幾種方法,這裡我選擇的是直接在程式碼中進行設定

設定worker

  • 關閉acker,將worker程序設定成2
  • 由於現在有兩個worker,兩個executor(見下面截圖),所以兩個executor被平均分配給了兩個worker,在我們這裡就是一個生產一個消費(從列印的日誌可以看出來)
Config config=new Config();
config.setNumWorkers(2);
config.setNumAckers(0);
StormSubmitter.submitTopology("SumTopology",config,topology);

這裡寫圖片描述

設定executor

  • 預設一個executor對應一個task,這裡我設定executor的數量為3,所以task也為3
builder.setBolt("countNum",new SumBolt(),3).shuffleGrouping("createNum");

這裡寫圖片描述

設定task

  • 預設情況下一個executor下只有一個task,但是當設定的task的數量大於executor的時候,一個executor上就可能有多個task
 builder.setSpout("createNum",new NumSpout());
 builder.setBolt("countNum",new SumBolt(),3)
         .setNumTasks(6)
         .shuffleGrouping("createNum");

這裡寫圖片描述
這裡寫圖片描述

設定acker

  • 設定acker的方式在第一個例子中已經示範過,這裡就不在演示了
  • 不過一般並不建議將acker關閉,這樣將無法保證資料的可靠性

動態設定並行度

  • 這裡我使用的是命令列的方式,至於storm ui的方式沒搞懂
  • 這裡我將worker改成1個,createNum改為2個executor,countNum改為2個executor注意這裡沒有調整task
  • 所謂的並行調整其實就是重新分配:task所在的executor,executor所在的worker。task是真正做事的bolt、spout。所以如果task數量不夠,即使將executor、worker的數量設定的再大也沒有用
docker run --link nimbus:nimbus -it --rm storm 
storm rebalance SumTopology -n 1 -e createNum=2 -e countNum=2