Storm集群和拓扑的深度调优
默认配置概览
在Storm中,默认配置包含以下几个关键方面:
1. Supervisor节点与Worker进程:每个Supervisor节点默认启动4个Worker进程。
2. Topology与Worker进程:通常,每个Topology默认占用一个Worker进程。
3. Executor与Task:在每个Worker中,会启动Executor,每个Executor默认启动一个Task。
并行度的理解与调整
1. 并行度概念:在Storm中,并行度主要包括三个层级:
- Topology的Worker进程并行数。
- Worker内的Executor线程并行数。
- Executor内的Task并行数。
有时过多的hashmap也会因为数据冗余导致出现时间对不上的问题
2. 并行度与性能:理论上,并行度越高,Topology的运行效率越高。但是,并行度的设置需要考虑到内存分配和系统硬件资源的平衡,以避免资源浪费。
ACK/Fail机制
1. 数据完整性保障:Storm通过ACK/Fail机制保证数据不丢失。每个Tuple从Spout发出时,会生成一个MessageID(默认或自定义生成)。
2. 处理机制:下游Bolt成功处理Tuple后,通过Acker进程通知Spout调用ACK方法;处理失败或超时,则调用Fail方法。
3. 完全处理概念:一个消息的完全处理取决于Tuple Tree中的每个Bolt是否都已完全处理该消息。
4. ACK/Fail线程配置:默认情况下,每个Worker进程启动1个Acker线程,提供ACK/Fail服务。
Worker通信机制
1. Worker内部元件:
- Receive线程:负责接收其他Worker的数据,存储于ArrayList中。
- Sent线程:维护消息队列,负责发送数据给其他Worker。
- Executor线程:每个Executor有自己的接收和发送缓冲区,负责数据处理。
2. 配置选项:可以通过各种配置参数调整缓冲区大小和通信机制。
性能调优策略
1. 并行度配置手段:
- `conf.setNumWorkers()`:设置Worker数量。
- `builder.setBolt()`:设定Executor数量。
- `setNumTask()`:调整Task数量。
2. 并行度决策因素:
- Worker数量取决于集群节点的内存容量和数据处理需求。
- Executor和Task的数量应考虑处理效率和资源分配。
附加调优技巧
1. 反压问题解决:通过配置参数控制反压,防止OOM现象。
2. 优化分组策略:选择合适的分组方法,如fieldGrouping或localOrShuffleGrouping。
3. 关闭ACK机制:如果不需要ACK,可通过`conf.setNumAckers(0)`关闭。
4. Worker与Executor比例:推荐1:10至1:15的比例。
5. 内存与通信优化:考虑使用CMS GC方法,调整Worker内存设置。
6. Supervisor和Nimbus配置:优化节点部署和资源分配。
有时过多的hashmap也会因为数据冗余导致出现时间对不上的问题
动态调整并行度
1. 使用Storm WebUI:直观地调整并行度设置。
2. 命令行工具:使用`storm rebalance`命令调整Worker和各组件的并行度。