本文导读:
1 Worker、Executor、task详解
2 配置拓扑的并发度
3 拓扑示例
4 动态配置拓扑并发度
Worker、Executor、Task详解:
Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:
1. Worker Process(工作进程)——Spout/Bolt中运行具体处理逻辑的进程
2. Executor(线程、执行器)——物理线程
3. Task(任务)——具体的处理逻辑对象
下图简要描述了这3者之间的关系:
storm集群的一个节点可能有一个或者多个工作进程(worker)运行在一个多个拓扑上,一个工作进程执行拓扑的一个子集。工作进程(worker)属于一个特定的拓扑,并可能为这个拓扑的一个或者多个组件(spout/bolt)运行一个或多个执行器(executor线程)。一个运行中的拓扑包括多个运行在storm集群内多个节点的进程。
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。
配置拓扑的并行度:
1.工作进程的数量
工作进程的数量表示集群中不同节点的拓扑可以创建多少个工作进程。
配置参数是:TOPOLOGY_WORKERS
也可以通过java API进行设置:
Config#setNumWorkers
2.执行器(线程)的数量
执行器的数量指的是每个组件产生多少个线程。
这个参数暂时只能通过java API进行配置:
TopologyBuilder#setSpout()
TopologyBuilder#setBolt()
3.任务的数量
任务的数量表示的是每个组件创建多少个任务。
配置选项:TOPOLOGY_TASKS
也可以通过java API进行配置:
ComponentConfigurationDeclarer#setNumTasks()
T setNumTasks(java.lang.Number val)
拓扑示例
下面我们定义一个名为mytopology的拓扑,由一个Spout组件(BlueSpout)、两个Bolt组件(GreenBolt和YellowBolt)共三个组件构成,代码如下:
1 Config conf = new Config();
2 conf.setNumWorkers(2);
3
4 topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2);
5
6 topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
7 .setNumTasks(4)
8 .shuffleGrouping("blue-spout");
9
10 topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
11 .shuffleGrouping("green-bolt");
12
13 StormSubmitter.submitTopology(
14 "mytopology",
15 conf,
16 topologyBuilder.createTopology()
17 );
mytopology拓扑的描述如下:
1、拓扑将使用两个工作进程(Worker)。
2、Spout是id为“blue-spout”、并行度为2的BlueSpout实例(产生两个执行器和两个任务)。
3、第一个Bolt的id为"green-bolt"、并行度为2、任务数为4、使用随机分组方式接收"blue-spout"所发射元组的GreenBolt实例(产生两个执行器和4个任务)。
4、第二个Bolt是id为"yellow-bolt"、并行度为6、使用随机分组方式接收"green-bolt"所发射元组的YellowBolt实例(产生6个执行器和6个任务)。
综上所述,该拓扑一共有两个工作进程(Worker),2+2+6=10个执行器(Executor),2+4+6=12个任务。因此,每个工作进程可以分配到10/2=5个执行器,12/2=6个任务。默认情况下,一个执行器执行一个任务,但是如果指定了任务的数目,则任务会平均分配到执行器中,因此,GreenBolt的实例"green-bolt"的一个执行器将会分配到4/2个任务。
mytopology的拓扑及其对应的资源分配如下图所示:
动态设置拓扑的并发度
Storm支持在不重启topology的情况下,动态的改变(增减)worker process的数目和executor的数目,称为rebalancing。有两种方式可以实现拓扑的再平衡:
1、使用Storm Web UI
2、使用Storm rebalance命令(推荐使用)
使用命令行的方式如下:
1 # 重新配置拓扑
2 # "mytopology" 拓扑使用5个Worker进程
3 # "blue-spout" Spout使用3个Executor
4 # "blue-spout" Bolt使用10个Executor
5
6 # storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
注:"mytopology"是拓扑的名称,"blue-spout"和"yellow-bolt"是组件的名称。
【参考链接】