在生产环境使用HBase过程当中,随着数据量的不断增长,查询HBase数据变得愈来愈慢,对于业务来讲是不可用的,须要对读性能进行优化缓存
从hbase监控指标来看,发现FullGC次数频繁,你们都知道FullGC对系统的影响很大,会使系统资源都耗在GC上,其它性能就会影响,另外一个异常是Compact队列一直在阻塞,须要compact的文件过多又不没法及时获得compact,这个就致使小文件愈来愈多得不到合并影响读性能。性能
初步定位到缘由以后,考虑从如下几个方面进行优化优化
1. 增长regionserver堆栈内存大小,此优化主要考虑到FullGC次数过多,尽可能避免Full GC的发生spa
2. 观察到集群读缓存率太低,不少时候读的数据都不在缓存中,blockcache得不到利用,因此考虑读写cahce比例调整,减少读增大memstore内存,提升写性能,避免写请求被阻塞线程
3. 调整small compact线程数,原来是设置了1 个small compact,为提升compact速率,线程调整为3code
4. 调整表region数,原来是对于全部的表预分配了1000个region,致使一些数据量小的表region数过多,优化后针对表的数据量调整了region的数量server
5. 调整region hfile数量 , 针对region hfile文件数过多的表,进行手动major_compact, 以提升读性能blog
6. 隔离表, 此步主要考虑到compact队列阻塞严重,因此考虑将一些表用几台新机器进行隔离, 最本质的其实仍是下降单region的hfile数量,下降以后在定位到数据在哪一个region以后,能够大幅减小扫描hfile的次数,具体方法以下,队列
a 确认要隔离的表 b 确认隔离的机器列表 c 建立group add_rsgroups 'test_tables' d 将机器列表move到新建组别 move_rsgroup_servers 'test_tables',['1.1.1.1:60020','1.1.1.2:60020','1.1.1.3:60020'] c 查看上面操做是否成功 get_rsgrup 'test_tables' d 将须要隔离的表move到group move_rsgroup_tables 'test_tables',['table1','table2']
进行隔离后,发现compact阻塞严重的表已经降低了,最直观的表现是读性能从原来的10几秒优化到200ms之内,读性能获得质的变化,最主要的优化是下降了每一个region的hfile数量,提升了定位数据区间的效率内存