storm 并行度说明

并行度,即 executor的个数,就是 线程的数量。

1、Worker

Worker是进程级别的,一个worker进程 对应执行一个 Topology 服务,一个运行中的 Topology 是由集群中的多个Worker进程组成的 。
反过来说,一个Worker里面不会运行属于不同的 Topology 的执行任务。

2、Executor

这里的 Executor,即线程,也是执行度 ,也是并行度。

Executor 是线程级别,一个Worker进程里有多个Executor线程,默认一个Executor运行一个task,
一个 Executor中只能运行隶属于同一个 component(spout/bolt)的 task 。
我们常说的 并行度,也就是 Executor 的个数。

3、Task

Task 是实例级别,一个Task对应一个 new Bolt() 或者一个new Spout() ;
一个 Executer 线程默认执行一个 Task,也可以设置为执行多个Task ;
如果一个 bolt 或 spout 有设置多个 Task ,Executor 就会在每次循环里顺序调用所有的task实例
每个 component( Spout/ Bolt)的 并发度 就是这个 component 对应的 task数量。
同时,Task 也是各个节点之间进行 grouping(partition)的单位。

4、默认

默认情况下一个 supervisor 节点会启动 4个worker 进程 ;
每个 worker 进程会启动 1个 executor 线程 ;
每个 executer 会启动1 个 task;

5、代码示例

Config cfg = new Config();
cfg.setNumWorkers(2);  //设置使用 2个工作进程(JVM)
cfg.setDebug(false);

TopologyBuilder builder = new TopologyBuilder();

//设置 spout 的并行度和任务数(2个线程 和 2个任务)
builder.setSpout("spout", new PWSpout(), 2);

//设置 print-bolt 的并行度和任务数:(2个线程 和 4个任务)
builder.setBolt("print-bolt", new PrintBolt(), 2).shuffleGrouping("spout").setNumTasks(4);

//设置 write-bolt 的并行度和任务数:(产生6 个线程 和 6个任务)
builder.setBolt("write-bolt", new WriteBolt(), 6).shuffleGrouping("print-bolt");

上面代码中,

进程数 ( JVM )= 2个workers = 2

线程数(Executor)= PWSpout (2) + PrintBolt (2) + WriteBolt (6) = 10

任务(Task)= PWSpout (2) + PrintBolt (4) + WriteBolt (6) = 12

总上可以得出:

10个线程/2个进程 = 5个线程/进程。

12个任务/2个进程 = 6 个任务/进程 ,所以每个工作进程( JVM )领到的 Task是12/2=6,即6个Task。

print-bolt :

线程数 = 2,任务 = 4

4/2=2 ,即每个 print-bolt 线程有 2个 任务。

默认情况下 ,一个 Executor 只执行一个任务,但如果指定了多个任务,则任务会平均分配到 Executor 中。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/90443823