Storm中涉及到了很多组件,例如nimbus,supervisor等等,在参考了这两篇文章之后,对这个有了更好的理解。

Understanding the parallelism of a Storm topology

https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topology

http://www.cnblogs.com/yufengof/p/storm-worker-executor-task.html

我们先理一下概念:

  1. 一般对于物理节点来讲,我们部署的节点的类型包括nimbus(master),supervisor(slave),通常是一个nimbus,多个supervisor。nimbus是负责安排任务给supervisor去完成的,即supervisor是实际上干活的。
  2. 而对于一个supervisor来讲,它可以包含多个worker,worker有可以包含多个executor,executor又可以执行多个task。

这样一说就有点乱,因为这个worker、executor、task和topology,spout和bolt之间又是怎么样的对应关系呢??

首先看下面一张图

Storm中并发程度的理解-LMLPHP

supervisor和node是一一对应的关系,而worker就是process(进程),executor就是thread(线程),task就是在spout或bolt中定义的函数。

这样就好理解了,这些从上到下都是一对多的关系。

那supervisor,worker和executor跟topology或component(包括spout和bolt)之间的对应关系呢?

  1. 一个topology可以在多个supervisor上执行,一个supervisor也可以执行多个topology
  2. 但是,一个worker只执行某个topology,一个topology由多个worker来执行
  3. 一个executor可以执行一个component中的多个task,但是一个component可以由多个executor来执行,这就是我们在编程中指定的并发程度。后面会看到。
  4. 一个executor默认对应一个task
  5. 一个worker中包含多个executor,但是这些executor不一定都是用来处理同一个component

我们看storm wiki中的一张图片来解释

Storm中并发程度的理解-LMLPHP

对于这个topology,

  1. 它包含3个component,1个spout,2个bolt
  2. 它包含2个worker process,10个executor thread,12个task
  3. 同颜色属于同一个component
 Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2 topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout"); topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
.shuffleGrouping("green-bolt"); StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);

代码如上,worker process,executor thread,task这些的数目都可以进行设置。

所以接下来我们应该会关心一个topology默认对应的worker数是多少?一个executor默认对应的task数是多少?

更重要的是,我们在编码过程中已经指定了worker process数和exector thread数,但是这两个数可以在运行时被修改,以更好地适应负载的变化!这样的方式叫做rebalance!

它能够修改worker的数目,也就是说我们是否可以通过监控,来实现自动水平拓展呢??例如结合IaaS,加一个supervisor节点加入到集群中?同时启动对应的worker进程,当负载低的时候,收回对应的supervisor节点,将虚拟机返回到对应的VM池里呢??

注意一点是:Task的数目在启动后就不能变了,但是可以改executor,即执行的线程数,所以executor数一定是小于等于task数,才能保证每一个executor至少有一个task可以运行.

所以对于task数太少,后期也无法提高太多!

  1. 第一种方式是使用storm的UI
  2. 第二种方式是使用CLI tool来修改
# Reconfigure the topology "mytopology" to use 5 worker processes,
# the spout "blue-spout" to use 3 executors and
# the bolt "yellow-bolt" to use 10 executors. $ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

具体请参考wiki的文章

05-11 11:30