本文导读:

1 Worker、Executor、task详解
2 配置拓扑的并发度
3 拓扑示例
4 动态配置拓扑并发度

Worker、Executor、Task详解:

Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:
1. Worker Process(工作进程)——Spout/Bolt中运行具体处理逻辑的进程
2. Executor(线程、执行器)——物理线程
3. Task(任务)——具体的处理逻辑对象

下图简要描述了这3者之间的关系:

  storm集群的一个节点可能有一个或者多个工作进程(worker)运行在一个多个拓扑上,一个工作进程执行拓扑的一个子集。工作进程(worker)属于一个特定的拓扑,并可能为这个拓扑的一个或者多个组件(spout/bolt)运行一个或多个执行器(executor线程)。一个运行中的拓扑包括多个运行在storm集群内多个节点的进程。

  1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务)。1个worker进程会启动1个或多个executor线程来执行1个topology的component(spout或bolt)。因此,1个运行中的topology就是由集群中多台物理机上的多个worker进程组成的。

  executor是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个component(spout或bolt)的task(注:task可以是1个或多个,storm默认是1个component只生成1个task,executor线程里会在每次循环里顺序调用所有task实例)。

  task是最终运行spout或bolt中代码的单元(注:1个task即为spout或bolt的1个实例,executor线程在执行期间会调用该task的nextTuple或execute方法)。topology启动后,1个component(spout或bolt)的task数目是固定不变的,但该component使用的executor线程数可以动态调整(例如:1个executor线程可以执行该component的1个或多个task实例)。这意味着,对于1个component存在这样的条件:#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。

配置拓扑的并行度:

1.工作进程的数量

工作进程的数量表示集群中不同节点的拓扑可以创建多少个工作进程。

配置参数是:TOPOLOGY_WORKERS

也可以通过java API进行设置:

Config#setNumWorkers

2.执行器(线程)的数量

执行器的数量指的是每个组件产生多少个线程。

这个参数暂时只能通过java API进行配置:

TopologyBuilder#setSpout()
TopologyBuilder#setBolt()

3.任务的数量

任务的数量表示的是每个组件创建多少个任务。

配置选项:TOPOLOGY_TASKS

也可以通过java API进行配置:

ComponentConfigurationDeclarer#setNumTasks()
T setNumTasks(java.lang.Number val)

拓扑示例

下面我们定义一个名为mytopology的拓扑,由一个Spout组件(BlueSpout)、两个Bolt组件(GreenBolt和YellowBolt)共三个组件构成,代码如下:

 Config conf = new Config();
conf.setNumWorkers(); topologyBuilder.setSpout("blue-spout", new BlueSpout(), ); topologyBuilder.setBolt("green-bolt", new GreenBolt(), )
.setNumTasks()
.shuffleGrouping("blue-spout"); topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), )
.shuffleGrouping("green-bolt"); StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);

mytopology拓扑的描述如下:

1、拓扑将使用两个工作进程(Worker)。

2、Spout是id为“blue-spout”、并行度为2的BlueSpout实例(产生两个执行器和两个任务)。

3、第一个Bolt的id为"green-bolt"、并行度为2、任务数为4、使用随机分组方式接收"blue-spout"所发射元组的GreenBolt实例(产生两个执行器和4个任务)。

4、第二个Bolt是id为"yellow-bolt"、并行度为6、使用随机分组方式接收"green-bolt"所发射元组的YellowBolt实例(产生6个执行器和6个任务)。

  综上所述,该拓扑一共有两个工作进程(Worker),2+2+6=10个执行器(Executor),2+4+6=12个任务。因此,每个工作进程可以分配到10/2=5个执行器,12/2=6个任务。默认情况下,一个执行器执行一个任务,但是如果指定了任务的数目,则任务会平均分配到执行器中,因此,GreenBolt的实例"green-bolt"的一个执行器将会分配到4/2个任务。

mytopology的拓扑及其对应的资源分配如下图所示:

动态设置拓扑的并发度 

  Storm支持在不重启topology的情况下,动态的改变(增减)worker process的数目和executor的数目,称为rebalancing。有两种方式可以实现拓扑的再平衡:

1、使用Storm Web UI

2、使用Storm rebalance命令(推荐使用)

使用命令行的方式如下:

 # 重新配置拓扑
# "mytopology" 拓扑使用5个Worker进程
# "blue-spout" Spout使用3个Executor
# "blue-spout" Bolt使用10个Executor # storm rebalance mytopology -n -e blue-spout= -e yellow-bolt=

注:"mytopology"是拓扑的名称,"blue-spout"和"yellow-bolt"是组件的名称。

【参考链接】

storm源码之理解Storm中Worker、Executor、Task关系

Storm并发度详解

storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解的更多相关文章

  1. 【原】storm源码之理解Storm中Worker、Executor、Task关系

    Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关 ...

  2. Storm中-Worker Executor Task的关系

    Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关 ...

  3. jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2

    请接着上一课继续看. $.Deferred()方法中,有两个对象,一个是deferred对象,一个是promise对象. promise对象有以下几个方法:state,always,then,prom ...

  4. jquery源码解析:jQuery延迟对象Deferred(工具方法)详解1

    请先看上一课的回调对象.Deferred是通过extend添加到jQuery中的工具方法.如下所示: jQuery.extend({ Deferred: function( func ) { }, w ...

  5. Vue.js 源码分析(十七) 指令篇 v-if、v-else-if和v-else 指令详解

    v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回true值的时候被渲染. v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用: 也可以使用 v- ...

  6. jQuery 源码解析(二十八) 样式操作模块 scrollLeft和scrollTop详解

    scrollLeft和scrollTop用于获取/设置滚动条的,如下: scrollLeft(val) ;读取或设置整个页面的水平滚动条距离 scrollTop(val) ;读取或设置整个页面的垂直滚 ...

  7. linux centos7下源码 tar安装mysql5.7.22或mysql5.7.20 图文详解

    之前用的rpm安装的每次安装都是最新的,,,导致每次版本不统一... 现在用tar包安装5.7.22和5.7.20一样的   5.7.20之后的和之前的版本还是有点不一样的 官网地址 https:// ...

  8. storm源码之storm代码结构【译】【转】

    [原]storm源码之storm代码结构[译]  说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...

  9. 【原】storm源码之storm代码结构【译】

    说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...

随机推荐

  1. ZeroMQ之Publish/Subscribe (Java)

    前面的文章介绍了比较简单的Request/Subscribe模式, 这篇文章介绍更为经典的Publish/Subscribe通信模式用来ZeroMQ的实现,其通信方式如下图: 客户端(subscrib ...

  2. 微信开发学习日记(八):7步看懂weiphp插件机制,核心目标是响应微信请求

    又经过了几个小时的梳理.回顾,截至目前,终于对weiphp这个框架的机制搞明白了些.想要完全明白,自然还需要大把的时间.第1步:   配置微信公众号,http://weiphp.jiutianniao ...

  3. Linux 怎么查看服务的启动进程所占用的目录

    lsof简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以 ...

  4. HDOJ 1312 DFS&BFS

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  5. Netbeans 配置英文和默认utf-8编码

    JAVA SDK 下载地址 http://www.oracle.com/technetwork/java/javase/downloads 解决办法: 进入netbeans 6.5\etc ,其中ne ...

  6. jqGrid 各种参数 详解

    JQGrid JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面 ...

  7. Trailing Zeros

    Write an algorithm which computes the number of trailing zeros in n factorial. Have you met this que ...

  8. iOS7 中的JavaScriptCore简单介绍

    以前写过一篇介绍如何使用第三方库在ios上进行js和oc交互调用的文章,链接如下 iOS 使用UIWebView把oc代码和javascript相关联.当时建立项目时,仍然是ios6时代,所以没有原生 ...

  9. putty mtputty 设置utf8编码

    2013年10月30日 10:02:36 先load你指定的ip 然后选择左侧目录中的windows->translation 再在右侧选择utf-8编码 选中后,点击左侧目录中的session ...

  10. Js数组里删除指定的元素(不是指定的位置)

    转载自:http://my.oschina.net/zh119893/blog/265964 之前一直是做后端的,从来也没有写过js,但是却一直想学学,也只是基于兴趣而已!现在到了这个公司,确实大量的 ...