本文从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的环境变量脚本中实现
读写内存规划写多读少型规划
在详细说明具体的容量规划前,首先要明确on heap模式下的内存分布图,如下图所示:
如图,整个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作为读缓存的补充,如下图所示
整个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 Descriptionhbase.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.