HBase BlockCache简介

MemStore 作为 HBase 的写缓存,保存着数据的最近一次更新,响应的 BlockCache 作为 HBase 的读缓存,保存着最近被访问的数据块。HBase 顺序地读取一个数据块到内存缓存中,读取相邻的数据就可以在内存中读取而不需要再次从磁盘中读取,有效减少磁盘IO。使用 Scan API 扫描的时候,建议关闭 BlockCache,Scan 的场景中缓存意义不大。

HBase 读取数据的时候优先查找 MemStore(最新的更新版本),其次会查找 BlockCache。首先了解一下 HBase Block 的概念。

HBase Block

在 HBase 中,存储文件被划分成若干个小存储块,默认是64k。在 get 或 scan 中一次会完全加载一个 block 到内存中。不同于 HDFS Block,HDFS 层面的块是用于拆分大文件以提供分布式存储,HBase Block 块存在于 HFile 的内部的数据结构,参考 HFile v1 版本:(详细请看 HFile 详解)


HBasel HFile v1

在建表语句中可以通过参数BlockSize指定:BLOCKSIZE => '65536'

HBase BlockCache

一个 RegionServer 有一个 BlockCache,在 RegionServer 启动的时候完成 BlockCache 的初始化工作(参考 RegionServer 启动源码)。

HBase 提供了几种 BlockCache 方案:

LruBlockCache

LruBLockCache 在 JVM 堆中,基于客户端对数据的访问频率,定义了三个不同的优先级队列,设计原理类似于 JVM 的堆分区策略。

BlockCahce 分级

  • single:block 被第一次访问,则该 Block 被放在这一优先级队列中。
  • multi:如果一个 Block 被多次访问,则从 single 移到 multi 中。
  • in memory:in memory 由用户指定,在内存中常驻,一般不推荐,只用系统表才使用 in memory 优先级。

分级的好处在于:
首先,通过 in memory 类型缓存,将重要的数据放到 RegionServer 内存中常驻,例如 Meta 或者 namespace 的元数据信息。
其次,通过区分 single 和 multi 类型缓存,可以防止由于 scan 操作带来的 cache 频繁更替。
默认配置下,对于整个 BlockCache,按照以下百分比分配给 single、multi 和 in memory 使用:0.25、0.5和0.25。无论哪个区,都会采用严格的 Least-Recently-Used 算法淘汰机制,最少使用的 Block 会被替换,为新加载的 Block 预留空间。

如果只使用 LruBlockCache,在内存较大时会存在GC的问题导致服务中断。

SlabCache

为了解决 LRUBlockCache 方案中因为JVM垃圾回收导致的服务中断,SlabCache 方案使用 Java NIO DirectByteBuffer 技术实现了堆外内存存储,不再由JVM管理数据内存。

默认情况下,系统在初始化的时候会分配两个缓存区,分别占整个 BlockCache 大小的80%和20%,其中前者主要存储小于等于 64K Block,后者存储小于等于 128K Block,如果一个 Block 超过128K 则两个区都不会缓存。SlabCache 也使用 LRU 算法对过期 Block 进行淘汰。和 LRUBlockCache 不同的是,SlabCache 淘汰 Block 的时候只需要将对应的 bufferbyte 标记为空闲,后续 block cache 对其上的内存直接进行覆盖即可。

由于以下设计上的原因被废弃:

  • 只能存储两种大小标准的 Block,由于不同表和列族的设置,会有多种类型的 block size,这样会导致内存使用率低,特别是在使用了 DataBlockEncoding 的情况下。
  • 因此,通常会将 SlabCache 和 LRUBlockCache 搭配使用,称为 DoubleBlockCache。Block 会在 SlabCache 和 LruBlockCache 都缓存一份,读操作会先查找 LruBlockCache,后查找 SlabCache,当在 SlabCache 中命中时会把 block 重新放回 LruBlockCache。实际应用中比单独用 LruBlockCache 没有明显改善。
  • 堆外内存的性能没有堆内存高

BucketCache

SlabCache 方案在实际应用中并没有很大程度改善原有 LruBlockCache 方案的GC弊端,还额外引入了诸如堆外内存使用率低的缺陷。

BucketCache 为了解决了 SlabCache 中存在的问题,首先其支持多种 Cache 方式,通过 hbase.bucketcache.ioengine 配置,有 heap、offheap 和 file 三种:

  • heap 使用jvm中的heap
  • offheap 使用堆外内存
  • file 使用文件的方式,利用SSD硬盘的使用,改进了使用率低的问题。

其次支持了多种不同大小的 bucket,以适应不同大小的 block size。可以通过参数 hbase.bucketcache.bucket.sizes 来配置不同 bucket 的大小。默认是14种,大小分别是4、8、16、32、40、48、56、64、96、128、192、256、384、512KB的block(逗号分隔)。并且,在某一大小类型的 Bucket 空间不足的情况下,系统也会从其他 Bucket 空间借用内存使用,不会出现内存使用率低的情况。

最后,使用堆外内存的性能问题(如拷贝内存)在2.0版本中解决 HBASE-11425

实际实现中,常将 BucketCache 和 LRUBlockCache 搭配使用,称为 CombinedBlockCache。
在 cache block 的时候会将 MetaBlock(包括 META、INDEX、BLOOM 等非DATA block)放入LruBlockCache,将 DataBlock 存储在 BucketCache 中。特殊情况是,表中设置了 CACHE_DATA_IN_L1 => 'true' 的 DataBlock 也会存入 LruBlockCache。

ExternalBlockCache

ExternalBlockCache 提供使用外部的缓存服务来进行缓存,如 memcached 和 redis 等。

更具体的缓存细节参考 HBase BlockCache源码

HBase 读路径

总结,HBase 读路径为,首先检查 MemStore,然后检查 BlockCache,最后检索 HFile,并且合并一条数据的信息(read merge)返回给客户端。


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

推荐阅读更多精彩内容

  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,945评论 3 17
  • [TOC] 摘录一 hbase.rootdir 这个目录是region server的共享目录,用来持久化HBas...
    昨夜今夕阅读 11,220评论 1 8
  • HBase存储架构图 HBase Master 为Region server分配region 负责Region s...
    kimibob阅读 5,588评论 0 52
  • 简介 HBase是高可靠性,高性能,面向列,可伸缩的分布式存储系统,利用HBase技术可在廉价PC Serve...
    九世的猫阅读 2,195评论 1 6
  • 本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理...
    达微阅读 2,736评论 1 13