Hbase BlockCache

1 LRU Cache

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

  • 1.缓存分层策略
    Hbase在LRU缓存基础上,采用了缓存分层设计,将整个BlockCache分为三个部分:single-access、mutil-access和inMemory。需要注意的是,Hbase系统的元数据放在InMemory区,因此设置数据属性InMemory=true需要非常谨慎,确保此列簇数据量很小且访问频繁,否则可能将hbase.meta元数据基础内存,严重影响所有业务性能。
  • 2.LRU淘汰算法实现
    系统在每次cache block时将BlockKey和Block放入hashmap后会检查BlockCache总量是都达到阈值,如果达到阈值,就会缓解淘汰线程对Map中的Block进行淘汰。系统设置了三个MinMaxPiorityQueue队列,分别对应上述三个分层,每个队列中的原始按照最近最少使用排列,系统会优先poll出最近最少使用的元素,将其对应的内存释放.可见,三个分层中的Block会分别执行LRU淘汰算法进行淘汰。
  • 3.LRU方案优缺点
    LRU方案使用JVM提供的HashMap管理缓存,简单有效。但随着数据从single-access区晋升到mutil-access区,基本上就伴随着对应的内存对象从young区到old区,晋升到old区的Block被淘汰后会变为内存垃圾,最终由CMS回收掉,会造成性能问题。由于此,BucketCache方案才会横空出世。

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的组织管理:

  • Hbase会根据每个bucket的size标签对bucket进行分类,相同size标签的bucket由同一个BucketSizeInfo管理,如上图,左侧存放64KB block的bucket有65KB BucketSizeInfo管理,右侧存放128KB block有129KB BucketSizeInfo管理。

  • hbase在启动的时候就决定了size标签分类,默认标签有(4+1)K、(8+1)K、(16+1)K … (48+1)K、(56+1)K、(64+1)K、(96+1)K … (512+1)K。而且系统会首先从小到大遍历一次所有size标签,为每种size标签分配一个bucket,最后所有剩余的bucket都分配最大的size标签,默认分配 (512+1)K,如下图所示:

    bucket预分配.png

  • Bucket的size标签可以动态调整,比如64K的block数目比较多,65K的bucket被用完以后,其他size标签的完全空闲的bucket可以转换为65K的bucket,但是至少保留一个该size的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缓存写入流程

  • 将block写入RAMCache。实际实现中,HBase设置了多个RAMCache,系统首先会根据blockkey进行hash,根据hash结果将block分配到对应的RAMCache中;
  • WriteThead从RAMCache中取出所有的block。和RAMCache相同,HBase会同时启动多个WriteThead并发的执行异步写入,每个WriteThead对应一个RAMCache;
  • BucketAllocator会选择与block大小对应的bucket进行存放(具体细节可以参考上节‘内存组织形式’所述),并且返回对应的物理地址偏移量offset;
  • WriteThead将block以及分配好的物理地址偏移量传给IOEngine模块,执行具体的内存写入操作;
  • 写入成功后,将类似<blockkey,offset>这样的映射关系写入BackingMap中,方便后续查找时根据blockkey可以直接定位;
    Block缓存读取流程
  • 首先从RAMCache中查找。对于还没有来得及写入到bucket的缓存block,一定存储在RAMCache中;
  • 如果在RAMCache中没有找到,再在BackingMap中根据blockKey找到对应物理偏移地址offset;
  • 根据物理偏移地址offset可以直接从内存中查找对应的block数据。

References

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,538评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,800评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,329评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,725评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,089评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,449评论 1 212
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,758评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,448评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,152评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,432评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,933评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,289评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,921评论 3 234
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,023评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,781评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,477评论 2 270
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,381评论 2 263

推荐阅读更多精彩内容