hbase的两种缓存结构MemStore和BlockCache

2种缓存结构特点

HBase在实现中提供了两种缓存结构:MemStore和BlockCache。

MemStore:BlockCache称为写缓存,HBase执行写操作首先会将数据写入MemStore,并顺序写入HLog。

BlockCache:BlockCache称为读缓存,HBase会将一次文件查找的Block块缓存到Cache中,以便后续同一请求或者邻近数据查找请求,可以直接从内存中获取,避免昂贵的IO操作。

BlockCache 实现方案

BlockCache是Region Server级别的,
一个Region Server只有一个Block Cache,在Region Server启动的时候完成Block Cache的初始化工作。
到目前为止,HBase先后实现了几种Block Cache方案,
LRUBlockCache是最初的实现方案,也是默认的实现方案;
HBase 0.92版本实现了第二种方案SlabCache,见HBASE-4027;
HBase 0.96之后官方提供了另一种可选方案BucketCache,见HBASE-7404。
HBase-1.2.4 中InclusiveCombinedBlockCache :启用外部缓存。
HBase-1.2.4 中CombinedBlockCache: 它是一个混合缓存, 是一个LRUBlockCache和BucketCache的混合体。

BucketCache可以有三种工作模式:heap、offheap、file。heap模式表示这些Bucket是从JVM Heap中申请,offheap模式使用DirectByteBuffer技术实现堆外内存存储管理,而file模式使用类似SSD的高速缓存文件存储数据块。

无论在哪一种工作模式下,BucketCache都会申请许多带有固定大小标签的Bucket,一种Bucket只是一种指定的BlockSize的数据块,初始化的时候申请14个不同大小的Bucket,而且即使在某一种Bucket空间不足的情况下,系统也会从其他Bucket空间借用内存使用,不会出现内存使用率低下的情况。

各种方案对比

1 在”缓存全部命中”场景下,LRUBlockCache可谓完胜CombinedBlockCache。因此如果总数据量相比JVM内存容量很小的时候,选择LRUBlockCache;

2 在所有其他存在缓存未命中情况的场景下, LRUBlockCache的GC性能几乎只有CombinedBlockCache 1/3,而吞吐量、读写延迟、IO、CPU等指标两者基本相当,因此建议选择CombinedBlockCache。

3 BucketCache模式比LruBlockCache模式GC表现好很好。

  • LRUBlockCache:适用于写多读少型
  • BucketCache:适用于写少读多型


4 LRUBlockCache的优缺点
优点: LRU方案使用JVM提供的HashMap管理缓存,简单有效。
缺点: 随着热点数据从Single-Access到Multi-Access区,那么这些数据在Single-Access就变成了垃圾数据,相当于内存对象从young区到old区 ,晋升到old区的Block被淘汰后会变为内存垃圾,最终由CMS回收掉,然而这种算法会带来大量的内存碎片,碎片空间一直累计就会产生臭名昭著的Full GC。尤其在大内存条件下,一次Full GC很可能会持续较长时间,甚至达到分钟级别。大家知道Full GC是会将整个进程暂停的。因此长时间Full GC必然会极大影响业务的正常读写请求。
5 强烈建议线上配置BucketCache模式

常用的BlockCache方案

MemStore和BlockCache 混合使用
使用 BlockCache的 BucketCache方案
使用 BlockCache的 CombinedBlockCache方案

赞(3) 打赏
特别声明:除特殊标注,本站文章均为原创,遵循CC BY-NC 3.0,转载请注明出处。三伏磨 » hbase的两种缓存结构MemStore和BlockCache

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏