Storm的并行度详解


文章来源:http://www.bubuko.com/infodetail-822074.html

Storm 的并行度详解
Storm 的并行度是非常重要的,通过提高并行度可以提高storm 程序的计算能力。
strom 是如何提高并行度的呢?
Strom 程序的执行是由多个supervisor 共同执行的。supervisor 运行的是topology 中的spout/bolt task
task   storm 中进行计算的最小的运行单位,表示是spout 或者bolt 的运行实例。
程序执行的最大粒度的运行单位是进程,刚才说的task 也是需要有进程来运行它的,在supervisor 中,运行task 的进程称为worker
Supervisor 节点上可以运行非常多的worker 进程,一般在一个进程中是可以启动多个线程的,所以我们可以在worker 中运行多个线程,这些线程称为executor ,在executor 中运行task
这样的话就可以提高strom 的计算能力。
总结一下:worker>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-0.9.3的压缩包中的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, spoutparallelism_hint);或者builder.setBolt( id, bolt, parallelism_hint);来提高线程数的。
l task(实例):通过boltDeclarer.setNumTasks( num);来设置实例的个数
默认情况下,一个supervisor节点会启动4个worker进程。每个worker进程会启动1个executor,每个executor启动1个task。
Ok,这几个参数都可以使用一些方法进行增加。
下面来举个例子看一下对这些配置修改之后的效果
l  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任务默认是每个worker进程启动一个executor线程来执行,,可以在topology中取消acker任务,这样的话就不会多出来一个executor和任务了。
代码如下:
实际上就是修改一个配置
topology.acker.executors
技术分享
这样的话在页面查看就只有两个executor和2个task了。
l  executor(线程),在spout和bolt中设置线程数,都设置为2个,查看ui界面
技术分享
现在使用的executor和tasks就是7个了,因为worker本身使用3个,spout和bolt分别使用2个。
技术分享
l  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值