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
我们先理一下概念:
- 一般对于物理节点来讲,我们部署的节点的类型包括nimbus(master),supervisor(slave),通常是一个nimbus,多个supervisor。nimbus是负责安排任务给supervisor去完成的,即supervisor是实际上干活的。
- 而对于一个supervisor来讲,它可以包含多个worker,worker有可以包含多个executor,executor又可以执行多个task。
这样一说就有点乱,因为这个worker、executor、task和topology,spout和bolt之间又是怎么样的对应关系呢??
首先看下面一张图
supervisor和node是一一对应的关系,而worker就是process(进程),executor就是thread(线程),task就是在spout或bolt中定义的函数。
这样就好理解了,这些从上到下都是一对多的关系。
那supervisor,worker和executor跟topology或component(包括spout和bolt)之间的对应关系呢?
- 一个topology可以在多个supervisor上执行,一个supervisor也可以执行多个topology
- 但是,一个worker只执行某个topology,一个topology由多个worker来执行
- 一个executor可以执行一个component中的多个task,但是一个component可以由多个executor来执行,这就是我们在编程中指定的并发程度。后面会看到。
- 一个executor默认对应一个task
- 一个worker中包含多个executor,但是这些executor不一定都是用来处理同一个component
我们看storm wiki中的一张图片来解释
对于这个topology,
- 它包含3个component,1个spout,2个bolt
- 它包含2个worker process,10个executor thread,12个task
- 同颜色属于同一个component
1 Config conf = new Config(); 2 conf.setNumWorkers(2); // use two worker processes 3 4 topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 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 );
代码如上,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数太少,后期也无法提高太多!
- 第一种方式是使用storm的UI
- 第二种方式是使用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的文章