Storm中Topology、Worker、Executor和Task的關係,如圖:
1、1個Topology對應1個或多個Worker進程,1個Worker進程只屬於1個Topology
2、1個Worker進程包含1個或多個Executor線程
3、1個Executor線程可以執行同類型的1個或多個Task,要麼都是spout的Task,要麼都是bolt的Task。如果 Executor數量 < Task數量 ,Executor線程會循環順序調用Task實例。
4、1個Task就是最終運行spout或bolt的實例
注意
-
默認情況下:1個Topology使用1個Worker,1個Worker使用1個Executor,1個Executor執行1個Task
-
可以配置 Executor線程數 <= Task數量,在資源充足下,建議兩者相等
-
想要提高並行度,提高的優先級:Worker數量 > Executor數量 > Task數量
上圖例子代碼:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spoutTask", spoutTask, 2).setNumTasks(3); //executor線程數爲 2,task爲 3
builder.setBolt("boltTask", boltTask, 2).setNumTasks(4).shuffleGrouping("spoutTask"); //executor線程數爲 2,task爲 4
Config conf = new Config();
conf.setNumWorkers(2); //設置Topology的Workers數爲 2
StormSubmitter.submitTopology("test", conf, builder.createTopology());