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());