HBase内存配置及JVM优化

本文从HBase内存布局说起,先充分了解HBase内存区的使用与分配,随后给出了不同业务场景下的读写内存分配规划,并指导如何分析业务的内存使用情况,以及在使用当中写内存Memstore及读内存扩展bucketcache的一些注意事项,最后为了保障群集的稳定性减少和降低GC对于集群稳定性的影响,研究及分享了一些关于HBase JVM配置的一些关键参数机器作用和范例,希望这些不断充实的经验能确保HBase集群的稳定性能更上一个台阶,大家有任何的想法和建议也欢迎一起讨论。

HBase的内存布局

一台region server的内存使用(如下图所示)主要分成两部分:

1.JVM内存即我们通常俗称的堆内内存,这块内存区域的大小分配在HBase的环境脚本中设置,在堆内内存中主要有三块内存区域,

20%分配给hbase regionserver rpc请求队列及一些其他操作

80%分配给memstore + blockcache

2.java direct memory即堆外内存,

其中一部分内存用于HDFS SCR/NIO操作

另一部分用于堆外内存bucket cache,其内存大小的分配同样在hbase的环境变量脚本中实现

HBase内存配置及JVM优化

读写内存规划

写多读少型规划

在详细说明具体的容量规划前,首先要明确on heap模式下的内存分布图,如下图所示:

HBase内存配置及JVM优化

如图,整个RegionServer内存就是JVM所管理的内存,BlockCache用于读缓存;MemStore用于写流程,缓存用户写入KeyValue数据;还有部分用于RegionServer正常RPC请求运行所必须的内存;

步骤 原理 计算 值
jvm_heap   系统总内存的 2/3   128G/3*2   80G  
blockcache   读缓存   80G*30%   24G  
memstore   写缓存   80G*45%   36G  

hbase-site.xmll

<property> <name>hbase.regionserver.global.memstore.size</name> <value>0.45</value> </property> <property> <name>hfile.block.cache.size</name> <value>0.3</value> </property>

读多写少型规划

与 on heap模式相比,读多写少型需要更多的读缓存,在对读请求响应时间没有太严苛的情况下,会开启off heap即启用堆外内存的中的bucket cache作为读缓存的补充,如下图所示

HBase内存配置及JVM优化

整个RegionServer内存分为两部分:JVM内存和堆外内存。其中JVM内存中BlockCache和堆外内存BucketCache一起构成了读缓存CombinedBlockCache,用于缓存读到的Block数据,其中BlockCache用于缓存Index Block和Bloom Block,BucketCache用于缓存实际用户数据Data Block

步骤 原理 计算 值
RS总内存   系统总内存的 2/3   128G/3*2   80G  
combinedBlockCache   读缓存设置为整个RS内存的70%   80G*70%   56G  
blockcache   主要缓存数据块元数据,数据量相对较小。设置为整个读缓存的10%   56G*10%   6G  
bucketcache   主要缓存用户数据块,数据量相对较大。设置为整个读缓存的90%   56G*90%   50G  
memstore   写缓存设置为jvm_heap的60%   30G*60%   18G  
jvm_heap   rs总内存-堆外内存   80G-50G   30G  

参数详解

Property Default Description
hbase.bucketcache.combinedcache.enabled   true   When BucketCache is enabled, use it as a L2 cache for LruBlockCache. If set to true, indexes and Bloom filters are kept in the LruBlockCache and the data blocks are kept in the BucketCache.  
hbase.bucketcache.ioengine   none   Where to store the contents of the BucketCache. Its value can be offheap、heap、file  
hfile.block.cache.size   0.4   A float between 0.0 and 1.0. This factor multiplied by the Java heap size is the size of the L1 cache. In other words, the percentage of the Java heap to use for the L1 cache.  
hbase.bucketcache.size   not set   When using BucketCache, this is a float that represents one of two different values, depending on whether it is a floating-point decimal less than 1.0 or an integer greater than 1.0.

If less than 1.0, it represents a percentage of total heap memory size to give to the cache.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfpfx.html