关于storm的基础,参照我这篇文章:流式计算storm
关于并发和并行,参照我这篇文章:并发和并行
关于storm的并行度解释,参照我这篇文章:storm的并行度解释
关于storm的流分组策略,参照我这篇文章:storm的流分组策略
关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机制

本文说的是对storm的并行度理解和如何在代码中实际的设置

1.Worker

Worker是进程级别的,一个worker进程对应执行一个Topology服务,一个运行中的Topology是由集群中的多个Worker进程组成的
反过来说,一个Worker里面不会运行属于不同的topology的执行任务。

2.Executer

Executer是线程级别,一个Worker进程里有多个Executer线程,默认一个Executor运行一个task,
一个Executor中只能运行隶属于同一个component(spout/bolt)的task
我们常说的并行度,也就是executer的个数

3.Task

Task是实例级别,一个Task对应一个new Bolt()或者一个new Spout()
一个Executer线程默认执行一个task,也可以设置为执行多个Task
如果一个bolt或spout有设置多个task,executer就会在每次循环里顺序调用所有的task实例
每个component(spout/bolt)的并发度就是这个component对应的task数量。
同时,task也是各个节点之间进行grouping(partition)的单位。

默认

默认情况下一个supervisor节点会启动4个worker进程
每个worker进程会启动1个executer线程
每个executer会启动1个task

注意

原生storm的一个executer可以有多个task,但是我们知道一个线程不管有多少的task,他的效率都不会增加,反而会因为线程在多个task之间切换而损失一些性能,所以有人就会有这个疑问,为什么可以一个executer可以对应多个task
其实这个是因为storm可以提供动态调整executer,而task的数量一旦启动就固定不能变了
所以一开始就想以后可以提高并行度,那么就最好将task的数量多弄一些
比如设置executer为2个,task的数量为4个,那么上线后executer的数量最多可以调至4个,再调大了,由于没有太多的task与之对应,所以也没什么用了

配置

看看以下这个拓扑结构的部分代码,我们说说这三个概念对应代码中的设置方式:

TopologyBuilder builder = new TopologyBuilder();
//设置这个splitbolt的executer数为2,即这个bolt会有两个线程
//设置这个splitbolt的task数为4,即这个bolt会有4个实例bolt,即真正的集群中会new出4个来,即内存中中会有4个splitbolt对象
//整体就是这个splitbolt会开两个线程,跑四个实例,平均一个线程跑两个实例对象
builder.setBolt(SPLIT_BOLT_ID, splitBolt,2).setNumTasks(4).XXXXXConfig config = new Config();
//设置这个topology的worker数为2个
config.setNumWorkers(2);

在运行过程中,线程数是可以动态调整的,但其他参数不能调整
大的方面,有多种方法可以进行并发度的配配置,其优先级如下:
defaults.yaml < storm.yaml < topology 私有配置 < component level(spout/bolt) 的私有配置

网上其他例子


如上面代码所示:
进程数=numWorkers=2
线程数=blue_parallelism_hint(2)+green_parallelism_hint(2)+yellow_parallelism_hint(6)=10

10个线程/2个进程 = 5个线程/进程

Blue-Spout 线程数 = 2
Blue-Spout Task数 = Blue-Spout NumTasks = 4

4/2=2 即每个Blue-Spout线程有2个Task。

线程数量即并发度可以动态调整,其它的参数启动后就不能调整了。

以一张图更清晰的说明:

storm的并行度的解释--- ( 看完就能理解 )相关推荐

  1. 看完让你理解WebSocket原理

    一.先来说一下Websocket是什么?(websocket与http有什么区别呢) WebSocket是html5出的东西(协议),并且是一个持久化的协议(下面将会讲到什么是持久化协议) HTTP是 ...

  2. 什么叫做API?看完你就理解了 老夏博客

    阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface, ...

  3. 什么是API?(看完你就理解了)

    阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface, ...

  4. 这篇看完我得理解ES6中中常见语法

    目录 前言 1let篇 1.1作用域 1.2变量提升 1.3相同作用域赋值 2const篇 3模板字符串篇 3.1传统 3.2模板字符串复制 4扩展运算符篇 4.1传统赋值 4.2扩展字符串复制 前言 ...

  5. 看完这个就理解升压斩波(Boost)电路了

    1.什么是斩波电路? 斩波电路原来是指在电力运用中,出于某种需要,将正弦波的一部分"斩掉".后来借用到DC-DC开关电源中,主要是在开关电源调压过程中,原来一条直线的电源,被线路& ...

  6. 华为LOGO是什么意思?看完任正非的解释,再看网友的解释,笑出声

    随着华为在国内名气的不断增加,人们对华为的了解程度也在不断加深,很多人都知道,原来华为不单单只是做手机,而且还在做通讯设备,甚至在国际上也很有名气.虽然我们对华为的业务了解不但加深,但是大家对华为LO ...

  7. 渣男 23 式 | 23 种设计模式的通俗解释,看完秒懂

    点上方"菜鸟学Python",选择"星标"共460篇原创干货,第一时间送达 来源:http://zhuanlan.zhihu.com/p/100746724 设 ...

  8. 用追女孩子的故事通俗解释 23 种设计模式,看完秒懂!

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 设计模式有两种分类方法,即根据模式的目的来分和根据模式 ...

  9. 为什么程序员怕改需求?看完这些神解释我笑了

    点击上方"前端开发博客",选择"设为星标" 回复"2"加入前端群 综合整理:程序员的那些事 为什么程序员/设计师怕改需求?网上有类似的段子, ...

最新文章

  1. 《深度探索C++对象模型》--3 Data语意学
  2. 删除json中的指定元素_DeleteFile,VBA中借助Windows Scripting Host删除指定文件
  3. 用delphi操作mapinfo
  4. 【分布式】1、CAP原则(CAP定理)、BASE理论
  5. 内网通mac能用吗_纯干货!小容量Mac装外置硬盘Windows系统最完美的方案!(多图)...
  6. LruCache在美团DSP系统中的应用演进
  7. Python 读入Excel表时如何判空NaN
  8. 【linux】Linux cp命令拷贝 不覆盖原有的文件
  9. window10 安装出现the error code is 2503错误的解决方法
  10. JMS(三):MessageListener
  11. efs文件解密软件_Pylocky勒索软件的受害者
  12. jvm内存模型_JVM|02内存模型
  13. C语言各种keyword
  14. python 逻辑回归 复杂抽样_如何用Python进行抽样?
  15. caffe中 softmax 函数的前向传播和反向传播
  16. 2020阿里云线上峰会预告
  17. 电脑必备必装的软件工具神器,强烈推荐
  18. SQLHelper--四种方法完整版
  19. Verilog RTL 代码实战 01——半加器全加器
  20. 八. geotrellis使用 矢量数据栅格化

热门文章

  1. day20 面向对象编程
  2. sharepoint timer job 读取config文件内容
  3. CoreJava学习第五课 --- 进入第二阶段:面向对象编程思想
  4. java乱码问题总结
  5. 【转】使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
  6. 知识管理≈内容管理≈文档管理≈项目文档管理
  7. RequestMapping注解的继承问题
  8. python调用大漠找图_[教程贴]按键精灵调用大漠插件后台找图示例
  9. 复制给节点的命令_深入理解redis主从复制原理
  10. android 2个界面抽屉,Android使用DrawerLayout创建左右两个抽屉菜单