本文主要出自:http://hbasefly.com/2016/06/18/hbase-practise-ram/
HBase的内存规划分为读缓存BlockCache及写缓存MemStore。
其中读缓存又分为两种模式:LRUBlockCache及BucketCache。
针对两种不同的应用场景(读多写少、写多读少),我们需要使用不同的工作模式。写多读少的场景下,我们推荐使用LRUBlockCache,读多写少的场景下,我们推荐使用BucketCache。
场景一:写多读少型 + LRUBlockCache
LRUBlockCache模式下的内存分布图如下所示,
图中分配给RegionServer进程的内存就是JVM内存,主要分为三部分:LRUBlockCache,用于读缓存;MemStore,用于写缓存;Other,用于RS运行所必须的其他对象;
内存规划思路
假设系统内存为96G,业务负载为30%读70%写;
(1)RS内存设置多少?
在不影响其他服务情况下越大越好,假如设置为64G,系统内存的2/3。
(2)LRUBlockCache及MemStore设置多少?
HBase在此处有个硬规定:LRUBlockCache + MemStore < 80% * JVM_HEAP,否则RS无法启动。
推荐内存规划:
MemStore = 45% * JVM_HEAP = 64G * 45% = 28.8G ,
LRUBlockCache = 30% * JVM_HEAP = 64G * 30% = 19.2G;
默认情况下Memstore为40% * JVM_HEAP,而LRUBlockCache为25% * JVM_HEAP
配置设置实践
(1)设置JVM参数如下:
-XX:SurvivorRatio=2 -XX:+PrintGCDateStamps -Xloggc:$HBASE_LOG_DIR/gc-regionserver.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -server -Xmx64g -Xms64g -Xmn2g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC
(2)hbase-site.xml中MemStore相关参数设置如下:
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.45</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.40</value>
</property>
(3)hbase-site.xml中LRUBlockCache相关参数设置如下:
<property>
<name>hfile.block.cache.size</name>
<value>0.3</value>
</property>
场景二:读多写少型 + BucketCache
BucketCache模式下的内存分布图如下所示,
如图,整个RegionServer内存(Java进程内存)分为两部分:JVM内存和堆外内存。其中JVM内存中LRUBlockCache和堆外内存BucketCache一起构成了读缓存CombinedBlockCache,用于缓存读到的Block数据,其中LRUBlockCache用于缓存元数据Block,BucketCache用于缓存实际用户数据Block;MemStore用于写流程,缓存用户写入KeyValue数据;还有部分用于RegionServer正常运行所必须的内存;
内存规划思路
假设系统内存为96G,业务负载为30%写70%读;
(1)RS内存设置多少?
在不影响其他服务情况下越大越好,假如设置为64G,系统内存的2/3。
(2)CombinedBlockCache、LRUBlockCache、BucketCache及MemStore内存设置多少?
内存 | 原理 | 设置值 |
---|---|---|
RS总内存 | 在系统内存允许且不影响其他服务的情况下,越多越好。设置为系统总内存的 2/3。 | 64G |
ConbinedBlockCache | 整个RS内存分为三部分:读缓存、写缓存、其他。基本按照5 : 3 : 2的分配原则。读缓存设置为整个RS内存的50% | 34G |
LRUBlockCache | LRU部分主要缓存数据块元数据,数据量相对较小。设置为整个读缓存的10% | 3G |
BucketCache | BucketCache部分主要缓存用户数据块,数据量相对较大。设置为整个读缓存的90% | 30G |
MemStore | 整个RS内存分为三部分:读缓存、写缓存、其他。基本按照5 : 3 : 2的分配原则。写缓存设置为整个RS内存的30% | 20G |
JVM_HEAP | RS总内存大小 – 堆外内存大小 | 30G |
配置设置实践
(1)设置JVM参数如下:
-XX:SurvivorRatio=2 -XX:+PrintGCDateStamps -Xloggc:$HBASE_LOG_DIR/gc-regionserver.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -server -Xmx40g -Xms40g -Xmn1g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC
(2)hbase-site.xml中MemStore相关参数设置如下:
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.66</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.60</value>
</property>
(3)hbase-site.xml中CombinedBlockCache相关参数设置如下:
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>34816</value>
</property>
<property>
<name>hbase.bucketcache.percentage.in.combinedcache</name>
<value>0.90</value>
</property>