HBase blockcache原理介绍

简介: HBase blockcache原理介绍,包括LruBlockCache和BucketCache。

1.核心组件

blockcache_

总入口是CacheConfig,这个类根据配置信息,来返回不同的具体cache组件;

默认会返回LruBlockCache,所有类型的block都会存入;

启用了BucketCache时,会返回CombinedBlockCache,此类中根据block类型,data block存入BucketCache,其它存入LruBlockCache;

2.LruBlockCache

blockcache_LRU
LruBlockCache内部较为简单,主要就是一个map,如上图所示,由hfilename+offset来唯一标识一个block;

LruBlockCache所能够使用的内存为堆的一定比例,通过hfile.block.cache.size设置,默认是0.4;
so,maxSize = heapSize * hfile.block.cache.size,以下参数都根据maxSize计算;

blockcache_LRU_maxsize
acceptSize:
使用量达到一定比例时会触发驱逐,该阈值通过hbase.lru.blockcache.acceptable.factor设置,默认是0.99;

minSize:
驱逐后最少剩余比例,该阈值通过hbase.lru.blockcache.min.factor设置,默认是0.95;

hardLimit:
使用量达到一定比例时则拒绝写入,该阈值通过hbase.lru.blockcache.hard.capacity.limit.factor设置,默认是1.2,这意味允许一定的超出;

关于驱逐:

  1. block分为3种类型,由BlockPriority字段区分,取值为single、mutli、inMem,空间分配默认为0.25:0.5:0.25;
  2. 系统表以及其它指定了InMem的表所含block会标记为inMem,其它block初次存入时标记为single,再次访问时会修改为multi;
  3. 存放时只要还有空间即可放入,空间分配比例只是在驱逐发生时进行计算使用;
  4. 驱逐时,会用minSize乘以各类型的比例,得到各类型最少要保留的minSize;
  5. 根据目前的算法,驱逐后的size,应该是略大于minSize的一个值,伪代码如下;
expectFreeSize = usedSize - minSize;//预期释放总大小
freedSize = 0;//当前已释放总大小
n=3;//类型数量
for type in ('single','multi','inMem'):
    overFlow = type.usedSize - type.minSize
    toBeFree = min(overFlow,(expectFreeSize - freedSize)/n)
    free(toBeFree)
    freedSize += toBeFree
    n--;

3.BucketCache

LruBlockCache的优点是实现简单,缺点是block的存入和释放伴随着内存的申请和释放,会带来内存碎片和gc过多的问题;

BucketCache采用了类似池的思路,预先申请内存并划分为一个个的bucket,这些bucket会一直存在并重复使用;

总体的读写流程如下图所示:
blcokcache_Bucket_

Block缓存写入流程:

  1. 将block写入RAMCache,然后系统会根据blockkey进行hash,根据hash结果将block分配到一组blockingQueue中;
  2. HBase会同时启动多个WriteThead,分别关联一个blockingQueue,并发的执行异步写入;
  3. 每个WriteThead读取到block数据后,调用bucketAllocator为这些block分配内存空间;
  4. BucketAllocator会选择与block大小对应的bucket进行存放,并且返回对应的物理地址偏移量offset;
  5. WriteThead将block以及分配好的物理地址偏移量传给IOEngine模块,执行具体的内存写入操作;
  6. 写入成功后,将类似这样的映射关系写入BackingMap中,方便后续查找时根据blockkey可以直接定位;

Block缓存读取流程:

  1. 首先从RAMCache中查找,对于还没有来得及写入到bucket的缓存block,一定存储在RAMCache中;
  2. 如果在RAMCache中没有找到,再在BackingMap中根据blockKey找到对应entry;
  3. 根据entry中的offset可以直接从内存中查找对应的block数据;

其中最核心的组件是BucketAllocator和IoEngine,前者负责block的逻辑地址分配,后者负责block的实际物理存放,内部结构如下:

blockcache_Bucket_
hbase中blocksize是可以灵活设置的,bucketCache预设了一组支持的大小,从4K~512k不等;

一个Bucket只能存放一种size的block,一种size对应一个BucketSizeInfo进行管理;

初始化时,每种size先分配1个bucket,剩余的都分配给最大的那个size,如黑色箭头所示;

分配过程中当前size如果空间不够,会挪用其它size的空闲bucket,如棕色箭头所示,这意味着有可能某个Bucket一开始存放了32k的block

,后面释放后空闲,被挪用后变成存放64k的block;

ioEngine有多种实现,可支持onheap、offheap、disk等;

关于驱逐:

  1. 2种情况下会触发,1是已使用超过95%(acceptableFactor),2是某个size的block分配不了(总量虽然没达到阈值,但不存在完全空闲的bucket供挪用);
  2. 驱逐后的最少剩余比例为85%(minFactor),遍历各个bucketSizeInfo,把超过85%的部分加起来,再乘以一个系数0.1(extraFreeFactor),就是要释放的大小;
  3. 具体计算方法复用了LruBlockCache的代码,也是按照single、multi、inMem及其比例进行计算和释放;
  4. 实际清理动作是修改一些状态数据,比如Bucket对象的freeList、freeCount,以及backMapping的键值对等,并不需要对底层的byteBuffer做什么操作;
  5. 对于refCount大于0的block,会先将其markedForEvict置为true,待各个使用方读取完成后调用returnBlock进行释放;

参考资料

http://hbasefly.com/2016/04/26/hbase-blockcache-2/?xuxezc=17idz1

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 SQL 分布式计算
技术心得记录:深入学习HBase架构原理
技术心得记录:深入学习HBase架构原理
|
存储 负载均衡 监控
HBase分布式数据库架构及原理
Client是操作HBase集群的入口,对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成,对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据。
693 0
HBase分布式数据库架构及原理
|
7月前
|
存储 算法 分布式数据库
HBase原理 | HBase内部探险
HBase原理 | HBase内部探险
121 0
|
存储 缓存 负载均衡
98 hbase原理
98 hbase原理
69 0
|
存储 运维 监控
分布式数据库HBase的重要机制和原理的宕机恢复和故障处理
HBase是一个分布式数据库系统,支持高可用性、高性能和高伸缩性。在分布式环境中,数据的分布式存储和管理是非常重要的。HBase通过分布式存储和管理数据来实现高可用性和高性能。同时,HBase还提供了一些重要的机制和原理来支持宕机恢复和故障处理。
455 1
|
存储 分布式计算 关系型数据库
|
存储 缓存 负载均衡
HBASE原理整理
HBASE原理整合
192 0
|
存储 容灾 大数据
分布式数据库HBase的重要机制和原理的容灾与备份机制
在当今的互联网时代,数据的安全性和可靠性已经成为了企业的核心竞争力之一。而在大数据领域,分布式数据库HBase作为一个开源的分布式数据库系统,因其高性能、高可靠性和易于扩展性等特点,受到了广泛的应用。本文将深入探讨HBase中的重要机制之一:容灾与备份机制,帮助开发者更好地理解和掌握HBase的工作原理。
449 0
|
存储 负载均衡 大数据
分布式数据库HBase的重要机制和原理的负载均衡原理
在当今的互联网时代,数据的存储和处理已经成为了企业的核心竞争力之一。而在大数据领域,分布式数据库HBase作为一个开源的分布式数据库系统,因其高性能、高可靠性和易于扩展性等特点,受到了广泛的应用。本文将深入探讨HBase中的重要机制之一:负载均衡原理,帮助开发者更好地理解和掌握HBase的工作原理。
420 0
|
存储 分布式计算 监控
分布式数据库HBase的重要机制和原理的复制原理
在当今的互联网时代,数据的存储和处理已经成为了企业的核心竞争力之一。而在大数据领域,分布式数据库HBase作为一个开源的分布式数据库系统,因其高性能、高可靠性和易于扩展性等特点,受到了广泛的应用。本文将深入探讨HBase中的重要机制之一:复制原理,帮助开发者更好地理解和掌握HBase的工作原理。
243 0