并行度,即 executor的个数,就是 线程的数量。
Worker是进程级别的,一个worker进程 对应执行一个 Topology 服务,一个运行中的 Topology 是由集群中的多个Worker进程组成的 。 反过来说,一个Worker里面不会运行属于不同的 Topology 的执行任务。
这里的 Executor,即线程,也是执行度 ,也是并行度。
Executor 是线程级别,一个Worker进程里有多个Executor线程,默认一个Executor运行一个task, 一个 Executor中只能运行隶属于同一个 component(spout/bolt)的 task 。 我们常说的 并行度,也就是 Executor 的个数。
Task 是实例级别,一个Task对应一个 new Bolt() 或者一个new Spout() ; 一个 Executer 线程默认执行一个 Task,也可以设置为执行多个Task ; 如果一个 bolt 或 spout 有设置多个 Task ,Executor 就会在每次循环里顺序调用所有的task实例 每个 component( Spout/ Bolt)的 并发度 就是这个 component 对应的 task数量。 同时,Task 也是各个节点之间进行 grouping(partition)的单位。
默认情况下一个 supervisor 节点会启动 4个worker 进程 ; 每个 worker 进程会启动 1个 executor 线程 ; 每个 executer 会启动1 个 task;
上面代码中,
进程数 ( 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 中。