一个WORKER PROCESS
-
一个worker process执行topology的一个子集。worker process属于特定的topology,并且可以为该topology的一个或多个组件(spout或bolt)运行一个或多个executor。正在运行的topology由在Storm集群中的许多机器上运行的类似worker process组成。
-
一个executor是由一个worker process生成的一个线程。它可能针对同一组件(spout或bolt)运行一项或多项任务。
-
在拓扑的整个生命周期中,组件的任务数量始终是相同的,但是组件的执行executors (threads)的数量会随着时间而变化。这意味着以下条件成立:#threads ≤ #tasks。默认情况下,Task数设置为与executor数相同,即Storm将在每个线程中运行一个任务。
并行度
一般来说,默认情况下一个Task就对应一个Thread,且#threads ≤ #tasks,也就是说可以在代码设置任务的数量,代码表示:
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) // 2为executor的数量,这时这个Bolt组件的并行度为2
.setNumTasks(4) // 如果不设置Task数量,则Task数量和executor相同,现在则为4
.shuffleGrouping("blue-spout");
案例A:如果只有一台机器,上面有两个worker process,这里Blue Spout并行度为2,没有设置任务数量,所以任务数量也为2。同理Green Bolt和Yellow Bolt并行度为2和6,但是任务数量为4和6,所以一个Green Bolt有两个线程执行四个 Task,一个线程执行2个Task,而Green则是每个Task独占一个线程,总的并行度为10,平均给worker process为5。
如图所示:
案例代码如下:
Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout");
topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
.shuffleGrouping("green-bolt");
StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);