线上集群应该如何配置参数呢?有的使用默认配置,有的使用的是其他公司推荐配置。这样的一些配置可能在大多数情况下没有问题,但是性能却未必最佳,资源未必都得到合理的利用。
不同的应用场景,不同的工作模式下,参数配置可能就有一些差别:
HBase内存规划直接涉及写缓存MemStore和读缓存BlockCache,影响系统内存的利用率,IO利用率等以及读写性能。但是针对不同的业务场景(读多写少或者读少写多)内存的配置完全不同。另外,对于读缓存,线上一般会有2种工作模式:LRUBlockCache和BucketCache
不同的工作模式下,相关的配置也不尽相同。
业务场景一: 读少写多 + LRUBlockCache
以上图就是分配给RegionServer进程的内存就是JVM内存,主要分为三部分:
LRUBlockCache(读缓存),MemStore(写缓存),HRegionServer其他使用内存
首先列出基本条件:
1 整个物理机的内存: 96G
2 业务负载分布: 30%读 70%写
1.1 规划RS内存
一般情况下,在不影响其他服务的情况下,越大越好,建议设置为物理机系统内存的2/3. 比如内存96G,那么RS设置为96GB*2/3 = 64GB
1.2 如何设置LRUBlockCache和MemStore
确定RegionServer总内存之后,接下来就需要规划LRUBlockCache和MemStore的内存了。
在写多读少的场景下,写缓存显然更应该分配更多的缓存,读缓存相对分配的较少;但是HBase中HRegionServer启动有一个条件:
LRUBlockCache + MemStore < 80% * JVM_HEAP,否则RS无法启动
推荐规划:
MemStore 内存 = 45% * JVM_HEAP(64G) = 28.8G
LRUBlockCache 内存 = 30% * JVM_HEAP(64G) = 19.2G
1.3 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:+CM
SParallelRemarkEnabled-XX:+UseCMSCompactAtFullCollection
-XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancy
Only -XX:CMSInitiatingOccupancyFraction=75-XX:-DisableExpli
citGC
1.4 MemStore配置参数如下:
表示RegionServer中所有MemStore占有内存在JVM内存中的比例上限。如果所占比例超过这个值,RS会首先将所有Region按照MemStore大小排序,并按照由大到小的顺序依次执行flush,直至所有MemStore内存总大小小于hbase.regionserver.global.memstore
.lowerLimit,一般lowerLimit比upperLimit小5%
1.5 LRUBlockCache配置
业务场景二:读多写少
整个RegionServer内存分为两部分:JVM 内存和对外内存。其中JVM内存中LRUBlockCache和对外内存BucketCache一起构成了读缓存
CombinedBlockCache,用于缓存读到的Block数据,其中LRUBlockCache用于缓存Meta Block,Bucket Cache 用于缓存真实数据Data Block.
MemStore用于写缓存
内存规划思路:
首先列出基本条件:
1 整个物理机的内存: 96G
2 业务负载分布: 30%写 70%读
2.1 规划RS内存
一般情况下,在不影响其他服务的情况下,越大越好,建议设置为物理机系统内存的2/3. 比如内存96G,那么RS设置为96GB*2/3 = 64GB
2.2 规划读缓存 CombinedBlockCache
整个RS内存分为三部分:读缓存、写缓存、其他。基本按照5 : 3 : 2的分配原则。读缓存设置为整个RS内存的50%
RS内存 * 50% = 32G
2.2.1 规划读缓存LRU部分
LRU部分主要缓存数据块元数据,数据量相对较小。设置为整个读缓存的10%
RS内存 * 50% * 10% = 3.2 G
2.2.2 规划读缓存BucketCache部分
BucketCache部分主要缓存用户数据块,数据量相对较大。设置为整个读缓存的90%
RS内存 * 50% * 90% = 28.8 G
2.3 规划写缓存MemStore
整个RS内存分为三部分:读缓存、写缓存、其他。基本按照5 : 3 : 2的分配原则。写缓存设置为整个RS内存的30%
RS内存 * 30% = 19.2G
2.4 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.6 MemStore相关配置
2.7 CombinedBlockCache相关配置
按照上述介绍设置之后,所有关于内存相关的配置基本就完成了。但是需要特别关注一个参数hfile.block.cache.size,这个参数在本案例中并不需要设置,没有任何意义。但是HBase的硬规定却是按照这个参数计算的,这个参数的值加上hbase.regionserver.global.memstore.upperLimit的值不能大于0.8,上文提到hbase.regionserver.global.memstore.upperLimit值设置为0.66,因此,hfile.block.cache.size必须设置为一个小于0.14的任意值。hbase.bucketcache.ioengine表示bucketcache设置为offheap模式;hbase.bucketcache.size表示所有读缓存占用内存大小,该值可以为内存真实值,单位为M,也可以为比例值,表示读缓存大小占JVM内存大小比例。如果为内存真实值,则为34G,即34816。hbase.bucketcache.percentage.in.combinedcache参数表示用于缓存用户数据块的内存(堆外内存)占所有读缓存的比例,设为0.90;