大数据

Hbase BlockCache

2018-09-29  本文已影响5人  薛定谔的猫Plus

1 LRU Cache

LRUBlockCache是目前hbase默认的BlockCache机制,实现机制也比较简单,是使用一个ConcurrentHashMap管理BlockKey到Block的映射关系,缓存Block只需要将BlockKey和对应的Block放到该HashMap中,查询缓存就根据BlockKey从HashMap中获取即可。同时该方案采用严格的LRU淘汰算法,当BlockCache总量达到一定阈值之后就会启动淘汰机制,最近最少使用的Block会被置换出来。在具体的实现细节方面,需要关注三点:

2 Bucket Cache

相比LRUBlockCache,BucketCache实现相对比较复杂。它没有使用jvm内存管理算法来管理缓存,而是自己对内存进行管理,因此不会出现因为出现大量碎片导致Full GC的情况发生。本节主要介绍BucketCache的具体实现方式(包括BucketCache的内存组织形式、缓存写入读取流程等)以及如何配置使用BucketCache。

2.1内存组织形式

下图是BucketCache的内存组织形式图,其中上面部分是逻辑组织结构,下面部分是对应的物理组织结构。Hbase启动之后会在内存中申请大量的bucket,如下图中黄色举行所示,每个bucket的大小默认都为2MB。每个bucket会有一个baseoffset变量和一个size标签,其中baseoffset变量表示这个bucket在实际物理空间中的起始地址,因此block的物理地址就可以通过baseoffset和该block在bucket的偏移量唯一确定;而size标签表示这个bucket可以存放的block块的大小,比如图中左侧bucket的size标签为65KB,表示可以存放64KB的block,右侧bucket的size标签为129KB,表示可以存放128KB的block。

Bucket组织对应物理结构.png

Hbase中使用BucketAllocator类实现对Bucket的组织管理:

3 Block缓存写入、读取流程

下图是block写入缓存以及从缓存中读取block的流程示意图,图中主要包括5个模块,其中RAMCache是一个存储blockkey和block对应关系的hashmap;WriteThread是整个block写入的中心枢纽,主要负责一异步写入block到内存空间;BucketAllocator在上一节详细介绍过,主要实现对bucket的组织管理,为block分配内存空间;IOEngine是具体的内存管理模块,主要实现将block数据写入对应地址的内存空间中;BackingMap也是一个HashMap,用来存储blockKey与对应物理内存偏移量的映射关系,用来根据blockkey定位具体的block;其中紫线表示cache block流程,绿线表示get block流程。

block读写流程.png

Block缓存写入流程

References

上一篇 下一篇

猜你喜欢

热点阅读