一、Storm并行度相关的概念

  Storm集群有很多节点,按照类型分为nimbus(主节点)、supervisor(从节点),在conf/storm.yaml中配置了一个supervisor,有多个槽(supervisor.slots.ports),每个槽就是一个JVM,就是一个worker(一个节点,运行一个worker),在每个worker里面可以运行多个线程叫做executor,在executor里运行一个topology的一个component(spout、bolt)叫做task。task  是storm中进行计算的最小的运行单位,表示是spout或者bolt的运行实例。

总结一下,supervisor(节点)>worker(进程)>executor(线程)>task(实例)

  程序执行的最大粒度的运行单位是进程,刚才说的task也是需要有进程来运行它的,在supervisor中,运行task的进程称为worker,
Supervisor节点上可以运行非常多的worker进程,一般在一个进程中是可以启动多个线程的,所以我们可以在worker中运行多个线程,这些线程称为executor,在executor中运行task。
提高storm的并行度,可 考虑如下几点:
worker(进程)>executor(线程)>task(实例)
增加work进程,增加executor线程,增加task实例
看下面的图:
这表示是一个work进程,其实就是一个jvm虚拟机进程,在这个work进程里面有多个executor线程,每个executor线程会运行一个或多个task实例。一个task是最终完成数据处理的实体单元。(默认情况下一个executor运行一个task).
worker,executor,task解释
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。
刚才从理论说明了如何提高集群的并行度,在这里我们就来看一下这些东西worker(进程)>executor(线程)>task(实例) 是如何设置的
l  worker(进程):这个worker进程数量是在集群启动之前配置好的,在哪配置的呢?是在storm/conf/storm.yaml文件中,参数是supervisor.slots.port,如果我们不在这进行配置的话,这个参数也是有默认值的,在strom-1.0.2的压缩包中的lib目录下,有一个strom-core.jar,打开这个jar文件,在里面有一个defaults.yaml文件中是有一些默认配置的。
默认情况下一个storm项目只使用一个work进程,也可以通过代码进行修改,通过config.setNumWorkers(workers)设置。(最好一台机器上的一个topology只使用一个worker,主要原因时减少了worker之间的数据传输)
注意:如果worker使用完的话再提交topology就不会执行,因为没有可用的worker,只能处于等待状态,把之前运行的topology停止一个之后这个就会继续执行了,
l executor(线程):默认情况下一个executor运行一个task,可以通过在代码中设置builder.setSpout(id,spout, parallelism_hint);或者builder.setBolt(id,bolt,parallelism_hint);来提高线程数的。
l task(实例):通过boltDeclarer.setNumTasks(num);来设置实例的个数
默认情况下,一个supervisor节点会启动4个worker进程。每个worker进程会启动1个executor,每个executor启动1个task。
Ok,这几个参数都可以使用一些方法进行增加。

二、示例说明

下面来举个例子看一下对这些配置修改之后的效果

1、worker(进程)

通过在代码中设置,可以在ui界面上查看worker的总数,并且还可以在linux服务器上执行jps查看work进程
在代码中设置使用3个worker,查看ui界面,发现workers是3个,executors使用了5个,为什么呢?因为每一个worker默认都会占用一个executor(这个executor会启动一个acker任务),这样就会占用三个,剩下的两个是spout和bolt实例占用了。
如果使用5个worker,executor会使用7个,因为worker本身就会占用5个,spout和bolt占用两个。
Acker任务:
  acker任务默认是每个worker进程启动一个executor线程来执行,可以在topology中取消acker任务,这样的话就不会多出来一个executor和任务了。

实际上就是修改TOPOLOGY_ACKER_EXECUTORS配置,如下:
// storm配置
Config stormConf = new Config();
stormConf.TOPOLOGY_ACKER_EXECUTORS = 0;//关闭

这样的话在页面查看executor和task的个数一样了。

2、 executor(线程)

在spout和bolt中设置线程数,都设置为2个,查看ui界面
现在使用的executor和tasks就是7个了,因为worker本身使用3个,spout和bolt分别使用2个。

3、 task(实例)

在sum中设置实例个数为5,查看ui界面
发现ui界面上显示的tasks是10,因为spout占用2个,bolt占用5个,剩下的3个由acker任务占用
注意:虽然在这设置了多个task实例,但是并行度并没有很大提高,因为只有两个线程去运行这些实例,只有设置足够多的线程和实例才可以真正的提高并行度。
在这设置多个实例主要是为了下面执行rebalance的时候用到,因为rebalance不需要修改代码,就可以动态修改topology的并行度,这样的话就必须提前配置好多个实例,在rebalance的时候主要是对之前设置多余的任务实例分配线程去执行。

三、在命令行中动态修改并行度

除了使用代码进行调整,还可以在shell命令行下对并行度进行调整。
storm rebalance mytopology -w 10 -n 2 -e spout=2 -e bolt=2
表示 10秒之后对mytopology进行并行度调整。把spout调整为2个executor,把bolt调整为2个executor。
注意:并行度主要就是调整executor的数量,但是调整之后的executor的数量必须小于等于task的数量,如果分配的executor的线程数比task数量多的话也只能分配和task数量相等的executor。

Storm并行度详解相关推荐

  1. 1.17.Flink 并行度详解(Parallel)、TaskManager与Slot、Operator Level、Execution Environment Level、Client Level等

    1.17.Flink 并行度详解(Parallel) 1.17.1.TaskManager与Slot 1.17.2.TaskManager与Slot 1.17.3.并行度(Parallel) 1.17 ...

  2. redis storm mysql_storm-redis 详解

    多的不说,先来代码分析,再贴我自己写的代码.如果代码有错误,求更正.. 导入两个关键包,其他项目需要的包,大家自己导入了,我pom下的包太多,不好一下扔上来. org.apache.storm sto ...

  3. Storm学习笔记(三)——Storm组件详解之Bolt、Topology

    目录 Bolt消息处理者 生命周期 开发Bolt组件 Topology拓扑 结构 运行模式 示例 Bolt消息处理者 Bolt在Storm中是一个被动的角色,它把元组作为输入,然后产生新的元组作为输出 ...

  4. storm 原理详解

    1 为什么要使用Storm? Apache Storm是一款免费且开源的分布式实时计算系统. Storm可以轻松地可靠地处理无限数据流,从而实时处理Hadoop进行批处理的操作.Storm很简单,可以 ...

  5. Storm 核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的 Storm 流处理程序被称为 Storm topology(拓扑).它是一个是由 Spouts 和 Bolts 通过 Stre ...

  6. [Trident] Storm Trident 教程,state详解、trident api详解及实例

    英文原址:https://github.com/nathanmarz/storm/wiki/Trident-tutorial ---------------- Trident是在storm基础上,一个 ...

  7. Storm概念、原理详解及其应用(一)BaseStorm

    本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数"wordc ...

  8. 访问Storm ui界面,出现Nimbus Summary或Supervisor Summary时有时无的问题解决(图文详解)...

    不多说,直接上干货! 前期博客 apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解) apache-storm-1.0.2.tar.gz的集群搭建(3节点)(图文详解)( ...

  9. Web Storm 20203.3详解安装汉化

    webs torm2020详解安装汉化详解 1.进入官网点击Download选择版本 https://www.jetbrains.com.cn/en-us/webstorm/ 2.点击Other ve ...

最新文章

  1. Heartrate:一个牛逼的工具,Python执行实时可视化
  2. 解决PyCharm ImportError: No module named tensorflow 详解
  3. tcp/ip 协议栈Linux源码分析二 IPv4分片报文重组分析二
  4. 数据分析不落地?典型案例教会你!
  5. 笔记-计算机网络基础-5G
  6. 队列的定义与操作-顺序存储,链式存储(C语言)
  7. Echarts双纵轴分隔线合并解决方案
  8. 计算机安装最新的安全补丁,Win10不要装!微软发布4月安全补丁合集
  9. 点击类名方法名如何连接到相应的Android源代码
  10. windows查询java的进程号命令_将Java服务/命令注册为Windows服务
  11. 简单了解一下ArcPy
  12. h, w = img.shape什么意思?
  13. pig的安装、pig的数据模型和pig的常用命令
  14. win10无法启动_常见的电脑故障分析:win10系统无法启动,造成的原因及解决教程...
  15. UEBA在信息安全领域的使用
  16. JMeter-01-性能测试基础知识介绍
  17. 【ProjectEuler】ProjectEuler_046
  18. 位在c语言中用什么定义,C语言中位段的详细介绍
  19. 系统,网络,硬件,安全
  20. 浏览器常用的图片优化 雪碧图/实体字符/svg

热门文章

  1. VS2017 配置 OpenGL 环境
  2. 3星|《数据思维:从数据分析到商业价值》:有趣的数据分析案例
  3. 微信小程序正式上线 可置于聊天窗口顶部
  4. Nginx配置——防盗链
  5. argparse库 学习记录
  6. Unity 中的协同程序
  7. JAVA学习(七)__Spring的@Autowired注入规则
  8. C#字符串中特殊字符的转义
  9. 单臂路由的配置及应用:
  10. windows常见的运行命令以及各快捷键组合