在storm的默认设置下
一个superviser启动4个worker进程
每一个topology占用一个worker进程
每个worker会启动excutor
每个excutor默认启动一个task
并行度的介绍
一个 topology 指定多少个 worker 进程并行运行
一个 worker 进程指定多少个 executor 线程并行运行
一个 excutor 线程指定多少个 task 并行运行
在Storm集群中,可以运行一个或多个topology。每个topology包含一个或多个worker进程,每个worker进程可以派生一个或多个executor线程。每个executor线程又可以派生一个或多个task,而task是实际的数据处理单元,也是Storm概念中最小的工作单元。spout或bolt的实例由task承载。
通常情况下,并行度设置越高,topology 的运行效率就越高。但是,不能盲目地将并行度设置得很高,还需要考虑每个 worker 分配的内存大小,并平衡系统的硬件资源,以避免资源浪费。
性能调优
合理的配置并行度
有几个手段可以配置 topology 的并行度:
1. conf.setNumWorkers() 配置 worker 的数量
2. builder.setBolt("NAME", new Bolt(), 并行度) 设置 executor 数量
3. spout/bolt.setNumTask() 设置 spout/bolt 的 task 数量
关于 worker 的并行度:worker 可以分配到不同的 supervisor 节点,这也是 Storm 实现多节点并行计算的主要配置手段。据此, workers 的数量,可以说是越多越好,但也不能造成浪费,而且也要看硬件资源是否足够。
此外,我们还可以根据 topology 中数据量的大小和各个 bolt 单元的业务代码执行时间来调整 worker 的内存空间。如果数据量很大且代码执行时间较长,可以考虑增加单个 worker 的工作内存。
总结起来,worker 的数量,取值因素有:
1. 节点数量,及其内存容量
2. 数据量的大小和代码执行时间
3. 机器的CPU、带宽、磁盘性能等也会对 Storm 性能有影响,但是这些外在因素一般不影响 worker 数量的决策。