xiyouiOS 2011-08-04
这段时间刚做完一个hbase项目,存储千亿规模的数据,12台dell,5小时完成扫库。
这里主要是对hbase的数据本地化机制作了优化,本文不对细节作描述。
在后期使用的过程中,使用方发现hbase的随机读性能出现了较大的下降,经常出现单个GET请求花费3-5秒的现象。这个事情困扰了我很久,因为从我的实验环境上是不可复现的。
实验环境和线上环境的主要区别是数据量和写压力:
实验环境百亿规模的数据,线上是千亿
实验环境基本上没有写压力,而线上随时有较大的写压力。
关于原因做了很多猜测,但是后来都被实验否定了,比如以为hdfs的性能不够,以为MetaRegion的性能问题等等。
经过一段时间的跟踪,终于发现问题出现在BloomFilter上,hbase的bloomfilter是惰性加载的,在写压力比较大的情况下,会有不停的compact并产生storefile,那么新的storefile是不会马上将bloomfilter加载到内存的,等到读请求来的时候才加载。
这样问题就来了,第一,我们的storefile设置的比较大,maxsize为2G,这会导致bloomfilter也比较大;第二,系统的读写压力都比较大。两个因素加起来,就导致了前边所说的问题。
解决办法:
1)去掉bloomfilter,我们的数据太大了,这个东西的好处看起来还不如不加好,瞬间就能搞定。
2)将bloomfilter改成激进的方式加载,这个要安排下,恩。