基本概念
一台物理机,运行多个拓扑。具体说就是,运行多个进程,每一个进程仅属于一个拓扑。
worker(工作进程) 是进程。
executor(执行器)是线程。
执行器运行着多个任务( task),但执行器只能执行一类组件,要么是spout要么是bolt。
组件的任务就是task,每一个bolt就相当于多个task。
eg:一个线程运行着 training-bolt的多个task,但默认是1线程1task。一个bolt的task数量在运行过程中是一定的,但是一个组件的线程数可以改变。
parallelism_hint表示:一个bolt的线程(executor)数量。
getThisTaskId(): Gets the task id of this task.
getThisTaskIndex(): Gets the index of this task id in getComponentTasks(getThisComponentId()) // 该index在运行过程中是不会变的。
setBolt("name",new Bolt(),2:执行的线程数).setNumTask(2);
一些相关代码
Config.setNumWorkers(10); //一个拓扑有多少个分布于集群中的进程。
builder.setBolt(); //第三个参数就是parallelism-hint
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout);//GreenBolt指定了初始有2个executor和4个关连的task。Storm会在每个 executor(线程)2个task。
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实例,当执行多个task实例时executor的数量就减少了)。这意味着,对于1个component存在这样的条件:#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。