码迷,mamicode.com
首页 > 其他好文 > 详细

Storm中Task数的设置与计算(1.0.1版本)

时间:2018-01-12 01:46:53      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:new   根据   int   地方   alt   post   rand   拓扑   如何   

==思考问题1==

向集群提交一个拓扑的时候,Storm是如何计算Task数以及Executor数的?

 

==思考问题2:==

构建拓扑的时候,有3个地方会影响task数,这3个地方之间有什么关系?

builder.setSpout("spout", new RandomSentenceSpout(), 5); //parallelism-hint
builder.setSpout("spout", new RandomSentenceSpout(), 5).setNumTask(1);
builder.setSpout("spout", new RandomSentenceSpout(), 5).setNumTasks(1).setMaxTaskParallelism(1);

 

==关于Task数的计算==

storm的拓扑分配的是在nimbus.clj中完成的。

代码路径:org/apache/storm/daemon/nimbus.clj

函数名称:mk-assignments

 

在整个处理过程中,有一个函数非常重要,看了之后上面的3个关系多少会清晰很多。

技术分享图片

这个代码是用clojure语言编写的,没有用过的人多少看起来会费劲,如果用普通的java来写,大概思路是这个样子的

num-tasks = (TOPOLOGY-TASKS == null ? TOPOLOGY-TASKS : parallelism-hint)    
max-parallelism = TOPOLOGY-MAX-TASK-PARALLELISM    
    
if (max-parallelism != null) {    
    if (max-parallelism < num-tasks) {    
        task数= max-parallelism    
    } else {    
        task数= num-tasks    
    }    
} else {    
    task数= num-tasks    
}

 

如果将3个参数进行排列组合之后,获得结果如下:

技术分享图片

 

==关于executor数的来源==

下图是一个从其他博客剪切过来的图片,可以看出:executor数是从我们的拓扑中取得的。

启动的时候,会将所有component的parallelism-hint累加,形成我们大家熟知的“并行度”。

技术分享图片

 

可但是,但可是,我在查看setNumTasks函数的源码注释的时候,可以看出来一个信息

技术分享图片

红线部分的直译(英文不好,翻译的可能不准确):

在整个拓扑结构的生命周期内,Spout/Bolt的任务数总是相同的,但是Spout/Bolt的执行器executors(线程)的数量可以随着时间而变化。

 

那么,问题来了,什么时候executor的数量会变化呢?我能想到的至少有一种场景吧。

使用storm rebalance命令,来动态调整拓扑“并行度”的时候,executor的数量是一定会变化的。

 

rebalance命令的参数如下所示:

技术分享图片

 

==简单总结==

1、有3个地方可以影响Task数,根据3个参数的结果决定Task数。

2、executor数 = 所有组件的parallelism-hint总数。

3、task数在生命周期内不变,executor数可能改变。

 

-------------

参考博客:

https://www.cnblogs.com/ierbar0604/p/4386480.html

http://lib.csdn.net/article/60/42875

Storm中Task数的设置与计算(1.0.1版本)

标签:new   根据   int   地方   alt   post   rand   拓扑   如何   

原文地址:https://www.cnblogs.com/quchunhui/p/8271349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!