现有Storm无法满足一些需求
- 现有storm调度太简单粗暴,无法定制化
- Storm 任务分配不平衡
- RPC OOM一直没有解决
- 监控太简单
- 对ZK 访问频繁
JStorm相比Storm更稳定
- Nimbus 实现HA:当一台nimbus挂了,自动热切到备份nimbus
- 原生Storm RPC:Zeromq 使用堆外内存,导致OS 内存不够,Netty 导致OOM;JStorm底层RPC 采用netty + disruptor保证发送速度和接受速度是匹配的
- 新上线的任务不会冲击老的任务:新调度从cpu,memory,disk,net 四个角度对任务进行分配,已经分配好的新任务,无需去抢占老任务的cpu,memory,disk和net
- Supervisor主线
- Spout/Bolt 的open/prepar
- 所有IO, 序列化,反序列化
- 减少对ZK的访问量:去掉大量无用的watch;task的心跳时间延长一倍;Task心跳检测无需全ZK扫描。
JStorm相比Storm调度更强大
- 彻底解决了storm 任务分配不均衡问题
- 从4个维度进行任务分配:CPU、Memory、Disk、Ne
- 默认一个task,一个cpu slot。当task消耗更多的cpu时,可以申请更多cpu slot
- 默认一个task,一个memory slot。当task需要更多内存时,可以申请更多内存slot
- 默认task,不申请disk slot。当task 磁盘IO较重时,可以申请disk slot
- 可以强制某个component的task 运行在不同的节点上
- 可以强制topology运行在单独一个节点上
- 可以自定义任务分配,提前预约任务分配到哪台机器上,哪个端口,多少个cpu slot,多少内存,是否申请磁盘
- 可以预约上一次成功运行时的任务分配,上次task分配了什么资源,这次还是使用这些资源
JStorm性能提升的原因
- Zeromq 减少一次内存拷贝
- 增加反序列化线程
- 重写采样代码,大幅减少采样影响
- 优化ack代码
- 优化缓冲map性能
- Java比clojure更底层
JStorm的其他优化点
- 资源隔离。不同部门,使用不同的组名,每个组有自己的Quato;不同组的资源隔离;采用cgroups 硬隔离
- Classloader。解决应用的类和Jstorm的类发生冲突,应用的类在自己的类空间中
- Task 内部异步化。Worker 内部全流水线模式,Spout nextTuple和ack/fail运行在不同线程