==思考问题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
原文地址:https://www.cnblogs.com/quchunhui/p/8271349.html