服务端调优
垃圾回收与JVM优化
Java本身提供了垃圾回收机制,依靠JRE对程序行为的各种假设进行垃圾回收。但是HBase支持海量数据持续入库,非常占用内存,因此繁重的负载会迫使内存分配策略无法安全地依赖于JRE的判断,主要调节的是RegionServer节点的JVM垃圾回收参数。
(1)HBASE_OPTS或者HBASE_REGIONSERVER_OPT变量来设置垃圾回收的选项,后面一般是用于配置RegionServer的,需要在每个子节点的HBASE_OPTS文件中进行配置。
- 设置新生代大小的参数,不能过小,过小则导致年轻代过快成为老年代,引起老年代产生内存随便。同样不能过大,过大导致所有的Java进程停止时间长。-XX:MaxNewSize=256m-XX:NewSize=256m 这两个可以合并成为-Xmn256m这一个配置来完成
- 设置垃圾回收策略:-XX:+UseParNewGC -XX:+UseConcMarkSweepGC也叫收集器设置,一般用于用于写在hbase-env.sh
- 设置CMS的值,占比多少时,开始并发标记和清扫检查。-XX:CMSInitiatingOccupancyFraction=70
- 内存大小:master默认为1G,可增加到2G,RegionServer默认1G,可调大到10G以上
(2)hbase.hregion.memstore.mslab.enabled默认值:true,这个是在hbase-site.xml中进行配置的值。说明:减少因内存碎片导致的Full GC,提高整体性能。
优化Region拆分合并以及预拆分Region
(1)hbase.hregion.max.filesize
在hbase-site.xml中进行配置,配置Region大小,0.94.12版本默认是10G,Region的大小与集群支持的总数据量有关系,如果总数据量小,单个Region太大,不利于并行的数据处理,如果集群需支持的总数据量比较大,Region太小,则会导致Region的个数过多,导致Region的管理等成本过高,如果一个RegionServer配置的磁盘总量为3T*12=36T数据量,数据复制3份,则一台RegionServer服务器可以存储10T的数据,如果每个Region最大为10G,则最多1000个region,因此默认配置还是比较合适的。如果要自己管理split,则应该调大该值,并且在建表时规划好Region数量和rowkey设计,进行Region预建,做到一定时间内,每个Region的数据大小在一定的数据量之下,当发现有大的Region,或者需要对整个表进行Region扩充时再进行split操作,这样可以在不同的Region上交错运行,分散I/O负载。
HBase配置文件
(1) hbase.regionserver.handler.count
该设置决定了处理RPC的线程数量,默认值是10。对于小负载的put或是get,delete等操作,handler数可以适当调大,比如:150。当请求内容很大(上MB,比如大的put、使用缓存的scans)的时候,如果该值设置过大则会占用过多的内存,导致频繁的GC,或者出现OutOfMemory,因此该值不是越大越好。
(2)hbase.regionserver.regionSplitLimit
控制最大的Region数量,超过则不可以进行split操作,默认是Integer.MAX,可设置为1,禁止自动的split,通过人工或者写脚本在集群空闲时执行。如果不禁止自动的split,则当Region大小超过hbase.hregion.max.filesize时会触发split操作(

本文详细介绍了HBase的服务端调优,包括JVM垃圾回收参数配置、Region拆分合并策略、HBase配置文件优化等。此外,还讨论了客户端的调优,如写缓存大小、scan缓存及读写分离策略,旨在提升HBase的性能和稳定性。
最低0.47元/天 解锁文章
272

被折叠的 条评论
为什么被折叠?



