Hbase offHeap(堆外内存)测试

Hbase offHeap(堆外内存)测试

blockcache是hbase中的读缓存,其主要组成包括LruCache和bucketCache,LruCache使用堆内内存,BucketCache使用堆外内存。本文是想对比hbase只用堆内内存作为读缓存(即只用LruCache)以及尝试配置BucketCache。以观察是否可以来减少GC,提高集群性能。

一、配置

使用两台同等规格的服务器,简称为主机A和主机B.

hbase使用堆内存总量均为8000M。

主机A为不配置堆外内存的主机,只使用0.39*8000=3120M堆内内存。相关参数为

<property>
<name>hfile.block.cache.size</name>
<value>0.39</value>
</property>

主机B配置了堆外内存和堆内内存,堆内内存为0.1*8000=800M,堆外内存为3172M,由于使用双重缓存后只有indexblock和bloomblock会存在堆内,datablock都会存在堆外,这一配置基本合理且总读缓存大小和主机A相差不大。由于设置相关参数为

<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.1</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>3172</value>
</property>
HBASE_OFFHEAPSIZE = 4G

二、测试方式。

主要观察点是读时间和GC情况。

使用hbase自带的性能评估工具HBase performanceEvaluation来做读写测试。

具体脚本如下

#首先写入一亿数据。
hbase pe --rows=100000000 --nomapred sequentialWrite 1 >> newTest.log 2>&1
#flush成hfile
echo "flush '"TestTable"'" | hbase shell
#重启hbase将gc数量归零
dbserver.sh restart_server_all hbase  >> newTest.log 2>&1
sleep 60s
#读取数据1000W数据10次
for((i=0;i<=10;i++)); do
    hbase pe --rows=10000000 --nomapred randomRead 1 >>newTest.log 2>&1
done
sleep 600s
#读取100W数据重复100次
for((i=0;i<=100;i++)); do
    hbase pe --rows=1000000 --nomapred sequentialWrite 1 >> newTest.log 2>&1
    hbase pe --rows=1000000 --nomapred randomRead 1 >> newTest.log 2>&1
done
#最后打印gc情况
jstat -gcutil `jps |grep HRegion|awk '{print $1}'` >> newTest.log 2>&1

三.测试结果比较

1、 所有读取总时间比较

采集了读取时间的信息,发现总体来讲A、B不存在明显的读性能差异。

2、gc情况比较

测试完成后观察两个机器的GC情况,发现使用堆外内存的相比未使用的,YGC还是FGC次数都相当,总的GC时间
缩短,主要体现在YGC时间缩短约20s。YGC时间减少是由于存放在堆内内存的block减少.

3、BlockCache使用情况

 hbase-root-regionserver-node1.log日志会每五分钟打印一次目前BlockCache使用情况,观察A、B在读取数据阶
段(09/07 18:30- -09/08 8:50)的BlockCache。
主机A只使用堆内内存(LruCache),初始化blockcache如下:

在读取过程中基本保持着固定的缓存(1020.01MB)

主机B使用堆外内存和堆内内存组合的CombinedCache,初始化BlockCache如下:

在读取过程中基本保持着固定的缓存,其中堆内内存使用量极少,因为DataBlock大部分在堆外存储
(1008.39MB)

4、其他的情况说明

 之前通过调用thrift读接口的方式进行测试,但发现BlockCache占用不明显,因此改用HBase PE来测试。自写的程
序效果不明显的主要原因是DBE中HBase有10W的最大读取量,且offset总是从0开始,除非是非常长时间的读取,
否则10W读取量只占很少的BlockCahce。HBase PE虽然也是offset从0开始,但是没有对于读取量的限制,一次性
读取尽量多的数据,BlockCache的占用就可以明显的看出。

四. 总结

 配置了堆外内存的机器和未配置的相比:
1、读性能接近,没有明显区别。
2、使用上述测试用例,YGC次数和FGC次数差别不大,但是YGC的时间从29s降为9s,有20s的缩短

 


作者:蛋挞

日期:2018.12.12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章