strom中Worker与Task关系
Worker和Task关系
– 1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务)。1个
worker进程会启动1个或多个executor线程来执行1个topology的component(spout或bolt)。因此,1个
运行中的topology就是由集群中多台物理机上的多个worker进程组成的。
– executor是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个
component(spout或bolt)的task(注:task可以是1个或多个,storm默认是1个component只生成1个
task,executor线程里会在每次循环里顺序调用所有task实例)。
– task是最终运行spout或bolt中代码的单元(注:1个task即为spout或bolt的1个实例,executor线程在执
行期间会调用该task的nextTuple或execute方法)。topology启动后,1个component(spout或bolt)的
task数目是固定不变的,但该component使用的executor线程数可以动态调整(例如:1个executor线程
可以执行该component的1个或多个task实例)。这意味着,对于1个component存在这样的条件:
#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,
即1个executor线程只运行1个task
简单来说:
一个work进程会运行一个topology,所以如果一个topology如果有三个基本单元(spout和bolt),此时会一个work就需要三个task。 如图所示。该work在同一时刻只会有三个task同时进行。Executor相当于一个线程池,同一时刻只会运行其中的一个。