Storm中涉及到了不少组件,例如nimbus,supervisor等等,在参考了这两篇文章以后,对这个有了更好的理解。html
Understanding the parallelism of a Storm topologynode
https://github.com/nathanmarz/storm/wiki/Understanding-the-parallelism-of-a-Storm-topologygit
http://www.cnblogs.com/yufengof/p/storm-worker-executor-task.htmlgithub
咱们先理一下概念:编程
这样一说就有点乱,由于这个worker、executor、task和topology,spout和bolt之间又是怎么样的对应关系呢??并发
首先看下面一张图函数
supervisor和node是一一对应的关系,而worker就是process(进程),executor就是thread(线程),task就是在spout或bolt中定义的函数。ui
这样就好理解了,这些从上到下都是一对多的关系。编码
那supervisor,worker和executor跟topology或component(包括spout和bolt)之间的对应关系呢?spa
咱们看storm wiki中的一张图片来解释
对于这个topology,
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数太少,后期也没法提升太多!
# 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的文章