理解Storm并行度

一个Topology可以运行多个Worker上,这样可以提高数据处理能力,因为一个worker就是一个进程,更确切的说是一个JVM,很自然的,我们可以想到如果一个worker中可以再起多个线程的话效率就会很高。事实上storm就是这么干的,worker并不是storm集群中最小运行单位。Executer才是storm集群中最小的运行单位。Executer其实是一个线程,你可以这样理解,worker是拓扑的最小运行单位,而Executer是Spout或者Bolt(其实spout也是bolt)最小运行单位。什么意思?运行一个拓扑就是启动一个jvm进程,启动一个spout或者bolt就是启动一个Executer线程(执行器线程)。
然后我们再看几个跟设置并行度有关的参数:
1.setSpout(String id, IRichSpout spout, Number parallelism_hint)
2.setNumTasks(Number val)
3.setNumWorkers(int workers)
4.setNumAckers(int numExecutors)

对于:parallelism_hint (并行度暗示)
其实就是Executor线程的个数,如果配置了worker就会平均分配到可用的worker上
对于:setNumTasks(Number val)
每个Executor执行器执行几个线程去做这件事,可以理解为多线程中同时执行几个run方法里
对于setNumWorkers
顾名思义及时jvm的数量
对于setNumAckers
消息处理的acker数量,辅助用,根据需求修改
其实在官网上有一个非常好的图片可以说清楚他们的关系:

这里写图片描述
关于动态修改需要知道的是:其实就是在调整executor的数量
在命令行动态修改并行度
除了使用代码进行调整,还可以在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。

猜你喜欢

转载自blog.csdn.net/chenbinkria/article/details/80939044