从数据结构比较HBase的3种memstore实现方案

简介: HBase的memstore目前存在3种实现:DefaultMemstore、CompactingMemstore、CCSMapMemStore,本文尝试从数据结构的角度对其进行比较。

HBase在写入时会将数据暂存在memstore中,满足一定条件后再刷到磁盘;

其实现主要有以下要求:

  1. 既要快速读取,还要快速写入
  2. 需要有序,以方便scan
  3. 尽可能内存友好,减少gc

目前存在以下3种实现方案:

  1. DefaultMemstore
  2. CompactingMemstore
  3. CCSMapMemStore

其核心的差异在于所采用的数据结构不同;

对于一个有序数据集合,通常用数组或链表的结构进行存放,二者具有如下特点:

  • 链表:定位需要遍历,时间复杂度为O(N),但新增不需要挪动现有元素;
  • 数组:通过二分查找定位,时间复杂度为O(logN),但新增麻烦,需要挪动现有元素;
    对比前述要求可知,链表和数组都无法同时满足1和2;

常见的做法是给链表增加额外的索引结构,形成跳表,以空间换时间;

基于链表的跳表:给链表增加索引节点后,可通过二分查找定位,时间复杂度为O(logN),并且新增时不需要挪动现有元素,但缺点是增加了很多节点,具体实现时意味着多了很多对象;
这个结构可满足要求中的1和2,但不满足3,Jdk中自带的ConcurrentSkipListMap就是一种实现,简称CSLM;

还有一种思路,就是把跳表的所有节点进行合并,存放到数组结构中;

基于数组的跳表:通过记录元素节点长度和其它节点位置,来体现跳表结构,即不要求数据按物理顺序存放,也可通过二分查找,还不需要太多对象;
这个结构可以很好的满足前述3点要求,那有没有什么缺点?由于节点位置都需要自己计算,对比链表跳表中的直接赋值,实现上要略微复杂一些;

阿里提供了一个这样的实现叫CompactedConcurrentSkipListMap,简称CCSM,下面是issue中的附图:
CCSMapStructure

前述3种memstore所采用的数据结构如下图所示:
3_memstore_

DefaultMemstore的实现中,active是可变的数据集,接受当前的写入操作,而snapshot是flusher线程基于之前的active生成,为不可变的数据集,这两部分都采用了Jdk自带的CSLM;

实际上由于snapshot部分不可变,不存在新增元素时需要移动现有元素的问题,所以用数组即可,可以减少跳表结构的额外节点开销,这就是CompactingMemstore的主要优化思路;

具体实现时active会比较小,大约2M左右,因此额外节点的数量就会比较少,写满后会flush成同样小的segment,然后compact等操作不停的将其转成数组结构,并合并为少量大的segment;

CCSMapMemStore则是将整个跳表实现替换掉,无论是active还是snapshot,从最大程度上减少了对象的创建,也避免了CompactingMemstore中compact带来的开销;

阿里提供的性能测试结果如下:
ccsmOnheap

ccsmOffheap

参考资料:
https://issues.apache.org/jira/browse/HBASE-14918
https://issues.apache.org/jira/browse/HBASE-20312
https://mp.weixin.qq.com/s/LPhfQmx0lhRayA_KQWD0-g

相关实践学习
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
目录
相关文章
|
供应链 算法 Java
java数据结构最经济的地下通道建设方案prim算法
MX是世界上第一大传媒娱乐企业,该公司数十年的经营历史中创作了很多经典影片,此外还经营着很多的规模十分宏大世界级的主题娱乐公园。最近MX公司刚和C国X城市达成协定,共同投资建设C国国内唯一一家主题娱乐公园。
59 0
|
存储 分布式计算 NoSQL
HBase的数据结构原理与使用
关键词:HBase Hadoop 大数据 大数据存储 数据开发 数据库
1186 0
HBase的数据结构原理与使用
|
存储 算法
算法设计与分析/数据结构与算法实验5:找新数最小的删除方案
算法设计与分析/数据结构与算法实验5:找新数最小的删除方案
126 0
算法设计与分析/数据结构与算法实验5:找新数最小的删除方案
数据结构91-字母转数字的方案
数据结构91-字母转数字的方案
44 0
数据结构91-字母转数字的方案
|
存储 算法 程序员
【数据结构】链式二叉树的实现(一)
【数据结构】链式二叉树的实现(一)
131 0
【数据结构】链式二叉树的实现(一)
【数据结构】堆(一)——堆的实现(二)
【数据结构】堆(一)——堆的实现(二)
124 0
【数据结构】堆(一)——堆的实现(二)
|
存储 程序员
【数据结构】堆(一)——堆的实现(一)
【数据结构】堆(一)——堆的实现(一)
127 0
【数据结构】堆(一)——堆的实现(一)
|
程序员
【数据结构】栈的实现
【数据结构】栈的实现
161 0
【数据结构】栈的实现
【数据结构】单链表 — 纯C实现单链表
【数据结构】单链表 — 纯C实现单链表
【数据结构】单链表 — 纯C实现单链表
【数据结构】顺序表—纯C实现顺序表
【数据结构】顺序表—纯C实现顺序表
【数据结构】顺序表—纯C实现顺序表