1.Storm并行度相关的概念
Storm集群有很多节点,按照类型分为nimbus(主节点),supervisor(从节点),在conf/storm.yaml中配置了一个supervisor,有多个槽(supervisor.slots.ports),每个槽就是一个JVM,就是一个worker(一个节点运行一个worker),在每个worker里面运行多个线程叫做executor,在executor里运行一个topology的一个commponet(spout,bolt)叫做task。
task是storm中进行计算的最小的运行单位,表示spout或者bolt的运行实例。
总结一下:
supervisor(节点) > worker(进程) > executor(线程) > task(实例)
程序执行的最大粒度的运行单位是进程,刚才说的task也是需要进程来运行它的,在supervisor中,运行task的进程称为worker,Supervisor节点上可以运行非常多的worker进程,一般在一个进程中是可以启动多个线程的,所以我们可以在worker中运行多个线程,这些线程称为executor,在executor中运行task.
看下面的图:
这表示是一个work进程,其实就是一个jvm虚拟机进程,在这个work进程里面有多个executor线程,每个executor线程会运行一个或多个task实例。一个task是最终完成数据处理的实体单元。(默认情况下一个executor运行一个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。