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之间又是怎么样的对应关系呢??

首先看下面一张图

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中的一张图片来解释

对于这个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的文章

最新文章

  1. 设置Hyper-V和VMware多个服务之间共存
  2. Android stdio Apktool源码编译
  3. mui学习记录
  4. 启动 Apache2.2 的问题
  5. AngularJS之Scope及Controller(一)
  6. Eclipse启动提示Failed to load the JNI shared library JVM.dll
  7. ubuntu配置DNS
  8. bzoj3791 作业
  9. C++ : 类型的别名和对象的别名
  10. 示例:Netty 处理 TCP数据分包协议
  11. asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
  12. C# yield return用法
  13. Python--day02(编程语言、运行python代码、变量)
  14. Color Schema 配色随笔
  15. spring 定时任务执行2次
  16. 用Python来操作redis 以及在Django中使用redis
  17. windows 安装 keras
  18. 新建git并将本地代码上传到分支
  19. POJ2739 Sum of Consecutive Prime Numbers 2017-05-31 09:33 47人阅读 评论(0) 收藏
  20. LeetCode141:Linked List Cycle

热门文章

  1. oc_转_构造对象的方法,以及类的继承
  2. python setup.py install 失败
  3. HDU4869:Turn the pokers(快速幂求逆元+组合数)
  4. [AngularJS学习笔记] 基础学习01
  5. work8
  6. SpringMVC+Spring+Hibernate+Maven+mysql整合
  7. Oracle的回收站和闪回查询机制(二)
  8. Spring AOP Example – Advice
  9. HDU 5832 A water problem (水题,大数)
  10. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三)