HBase内存规划

线上集群应该如何配置参数呢?有的使用默认配置,有的使用的是其他公司推荐配置。这样的一些配置可能在大多数情况下没有问题,但是性能却未必最佳,资源未必都得到合理的利用。

 

 

不同的应用场景,不同的工作模式下,参数配置可能就有一些差别:

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配置参数如下:

<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>

 

表示RegionServer中所有MemStore占有内存在JVM内存中的比例上限。如果所占比例超过这个值,RS会首先将所有Region按照MemStore大小排序,并按照由大到小的顺序依次执行flush,直至所有MemStore内存总大小小于hbase.regionserver.global.memstore

.lowerLimit,一般lowerLimit比upperLimit小5%

 

1.5 LRUBlockCache配置

<property>

   <name>hfile.block.cache.size</name>

   <value>0.3</value>

</property>

 

业务场景二:读多写少



整个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相关配置

<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>

 

2.7 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>

 

按照上述介绍设置之后,所有关于内存相关的配置基本就完成了。但是需要特别关注一个参数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;
展开阅读全文

没有更多推荐了,返回首页