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的文章

Storm中并发程度的理解的更多相关文章

  1. 关于go中并发的初步理解

    1.一些概念的介绍: 概念 描述 进程 在内存中的程序.有自己独立的独占的虚拟 CPU .虚拟的 Memory.虚拟的 IO devices. (1) 每一进程占用独立的地址空间. 此处的地址空间包括 ...

  2. 2、Storm中的一些概念理解

    1.Tuple,Value,Field Tuple官方解释: "A tuple is a named of values where each value can be any type.& ...

  3. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  4. 用实例的方式去理解storm的并发度

    什么是storm的并发度 一个topology(拓扑)在storm集群上最总是以executor和task的形式运行在suppervisor管理的worker节点上.而worker进程都是运行在jvm ...

  5. Jmeter中一些概念的理解——90%响应时间、事务、并发

    一.90%响应时间(参考虫师博客) 90%Line  一组数由小到大进行排列,找到他的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12 . 用在性能测试的响应时间,也就是90%请求 ...

  6. go---weichart个人对Golang中并发理解

    个人觉得goroutine是Go并行设计的核心,goroutine是协程,但比线程占用更少.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现. 十几个gorou ...

  7. Storm中遇到的日志多次重写问题(一)

    业务描述: 统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数.并且每过5秒将数据按照json文件的形式写入日志.其中保存 ...

  8. storm的并发机制

    storm的并发机制 storm计算支持在多台机器上水平扩容,通过将计算切分为多个独立的tasks在集群上并发执行来实现. 一个task可以简单地理解:在集群某节点上运行的一个spout或者bolt实 ...

  9. storm中worker、executor、task之间的关系

    这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...

随机推荐

  1. java集合框架复习

    数组类Array是java中最基本的一个存储结构,它用于存储 一组连续的对象或一组类型相同的基本类型的数据. Array特点:效率高,但容量固定且无法动态改变, 缺点:无法判断其中存有多少元素,len ...

  2. matlab search path

    What Is the MATLAB Search PathThe search path, or path is a subset of all the folders in the file sy ...

  3. 【现代程序设计】【homework-07】

    C++11 中值得关注的几大变化 1.Lambda 表达式 Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ...

  4. 递归算法,JavaScript实现

    我们先来看一下定义.递归算法,是将问题转化为规模缩小的同类问题的子问题,每一个子问题都用一个同样的算法去解决.一般来说,一个递归算法就是函数调用自身去解决它的子问题. 递归算法的特点: 在函数过程中调 ...

  5. thymeleaf中的th:remove用法

    一.删除模板片段使用th:remove属性 th:remove的值如下: 1.all:删除包含标签和所有的孩子. 2.body:不包含标记删除,但删除其所有的孩子. 3.tag:包含标记的删除,但不删 ...

  6. redis神器

    redis是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存. redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上. ...

  7. 用6个字符写出任意的Javascript代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用6个字符写出任意的Javascript代码.

  8. Myeclipse 10.x 安装Aptana3.2 插件

    安装步骤: 1.下载aptana3.2 Eclipse Plugin插件. 下载地址:http://update1.aptana.org/studio/3.2/024747/index.html 2. ...

  9. SqlServer获取表结构语句

    --sql server 2005-- 1. 表结构信息查询 -- ================================================================== ...

  10. UVA 1600

    Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows a ...