并行度相关概念
和spark driver、work、executor一样,storm也有一套自己的概念。Storm集群中的节点可以分为两类:主节点nimbus,从节点supervisor。nimbus主要负责分配计算资源,supervisor主要负责执行client提交的任务。supervisor节点在运行任务时,涉及到以下三个概念:worker、executor、task。
worker
supervisor在执行任务时,会启动一个或者多个jvm进程,这些进程统称为worker。默认情况下一个supervisor最多可以启动4个worker,也可以通过修改storm.yaml参数进行修改。因为topology最终都是通过worker来执行的,所以nimbus并不关心有几个supervisor,只关心有多少个worker,至于worker分配在哪个节点上,nimbus是不关心的。需要说明的是,一个worker只能同时运行一个topology,如果在该worker运行时又有topology提交,nimbus会将其分配给其他空闲的worker。
executor
在一个jvm进程中,有时候我们会开启多个线程执行任务,这里executor的概念就是线程的概念。
task
executor中运行的topology的一个component,如spout、bolt,叫做task,task是storm中进行计算的最小运行单位,表示spout和bolt的运行实例。
资源设置的注意事项
worker
worker个数的增加,会导致worker之间数据传输时间增加。如果程序瓶颈在于待处理的元组数据太多算力不足,那么通过可以通过增加worker个数提高计算效率。
executor
executor是真正的并行度。executor初始数量=spout数量+bolt数量+acker数量,也就是task个数,默认一个executor对应一个task。其中spout、bolt、acker数量运行时是不会变化的,但是executor数量是可以变化的。
task
task的存在是为了topology扩展的灵活性,与并行度无关。task在实际执行数据处理。如果单纯提高task个数,不增加executor个数,并不一定能提高性能。提高task任务数量,可以为后期进行弹性计算(rebalance)即后期动态调整某一组件的并行度。
并行度计算
计算并行度官网有个比较好的例子
上图中,有2个worker进程,
- 蓝色的BlueSpout有2个executor进程,每个executor有1个task,并行度为2;
- 绿色的GreenBolt有2个executor进程,每个executor有2个task,并行度为2;
- 黄色的YellowBolt有6个executor进程,每个executor有1个task,并行度为6;
- 上图总平行度是2+2+6=10,具体分配到每个worker上就是5个