技术篇-HBase 2.0 新特性之 In-Memory Compaction

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: In-Memory Compaction 是 HBase2.0 中的重要特性之一,通过在内存中引入 LSM 结构,减少多余数据,实现降低 flush 频率和减小写放大的效果。本文根据 HBase2.0 中相关代码以及社区的讨论、博客,介绍 In-Memory Compaction 的使用和实现原理。

In-Memory Compaction 是 HBase2.0 中的重要特性之一,通过在内存中引入 LSM 结构,减少多余数据,实现降低 flush 频率和减小写放大的效果。本文根据 HBase2.0 中相关代码以及社区的讨论、博客,介绍 In-Memory Compaction 的使用和实现原理。

1. 原理

1.1 概念和数据结构

In-Memory Compaction 中引入了 MemStore 的一个新的实现 类 CompactingMemStore 。顾名思义,这个类和默认 memst。 CompactingMemStore 中,数据以 segment 作为单位进行组织,一个 memStore 中包含多个 segment。数据写入时首先进入一个被称为 active 的 segment,这个 segment 是可修改的。当 active 满之后,会被移动到 pipeline 中,这个过程称 为 in-memory flush 。pipeline 中包含多个 segment,其中的数据不可修改。 CompactingMemStore 会在后台将 pipeline 中的多个 segment 合并为一个更大、 更紧凑的 segment,这就是 compaction 的过程。
如果 RegionServer 需要把 memstore 的数据 flush 到磁盘,会首先选择其他类型 的 memstore,然后再选择 CompactingMemStore。这是因为 CompactingMemStore 对内存的管理更有效率,所以延长 CompactingMemStore 的生命周期可以减少总的 I/O。当 CompactingMemStore 被 flush 到磁盘时, pipeline 中的所有 segment 会被移到一个 snapshot 中进行合并然后写入 HFile。

_2019_01_11_1_47_55

在默认的 MemStore 中,对 cell 的索引使用 ConcurrentSkipListMap,这种结构支持动态修改,但是其中存在大量小对象,内存浪费比较严重。而在 CompactingMemStore 中,由于 pipeline 里面的数据是只读的,就可以使用更紧凑的数据结构来存储索引,减少内存使用。代码中使用 CellArrayMap 结构来存 储 cell 索引,其内部实现是一个数组。

_2019_01_11_1_48_38

1.2 Compaction 策略

当一个 active segment 被 flush 到 pipeline 中之后,后台会触发一个任务对 pipeline 中的数据进行合并。合并任务会对 pipeline 中所有 segment 进行 scan,将他们 的索引合并为一个。有三种合并策略可供选择:Basic,Eager,Adaptive。

Basic compaction 策略和 Eager compaction 策略的区别在于如何处理 cell 数据。 Basic compaction 不会清理多余的数据版本,这样就不需要对 cell 的内存进行拷 贝。而 Eager compaction 会过滤重复的数据,并清理多余的版本,这意味着会 有额外的开销:例如如果使用了 MSLAB 存储 cell 数据,就需要把经过清理之后 的 cell 从旧的 MSLAB 拷贝到新的 MSLAB。basic 适用于所有写入模式,eager 则 主要针对数据大量淘汰的场景:例如消息队列、购物车等。

Adaptive 策略则是根据数据的重复情况来决定是否使用 Eager 策略。在 Adaptive 策略中,首先会对待合并的 segment 进行评估,方法是在已经统计过不重复 key 个数的 segment 中,找出 cell 个数最多的一个,然后用这个 segment 的 numUniqueKeys / getCellsCount 得到一个比例,如果比例小于设定的阈值,则使 用 Eager 策略,否则使用 Basic 策略。

2. 使用

2.1 配置

2.0 中,默认的 In-Memory Compaction 策略为 basic。可以通过修改 hbase- site.xml 修改:

<property> 
<name>hbase.hregion.compacting.memstore.type</name> 
<value><none|basic|eager|adaptive></value>
</property>

也可以单独设置某个列族的级别:

create ‘<tablename>’,
{NAME => ‘<cfname>’, IN_MEMORY_COMPACTION => 
‘<NONE|BASIC|EAGER|ADAPTIVE>’}

2.2 性能提升

社区的博客中给出了两个不同场景的测试结果。使用 YCSB 测试工具,100-200 GB 数据集。分别在 key 热度符合 Zipf 分布和平均分布两种情况下,测试了只有写操作情况下写放大、吞吐、GC 相比默认 Memstore 的变化,以及读写各占 50% 情况下尾部读延时的变化。测试结果如下表:

_2019_01_11_1_51_43

作者:陆豪 阿里巴巴 技术专家

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 分布式计算 大数据
HBase分布式数据库关键技术与实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析了HBase的核心技术,包括数据模型、分布式架构、访问模式和一致性保证,并探讨了其实战应用,如大规模数据存储、实时数据分析及与Hadoop、Spark集成。同时,分享了面试经验,对比了HBase与其他数据库的差异,提出了应对挑战的解决方案,展望了HBase的未来趋势。通过Java API代码示例,帮助读者巩固理解。全面了解和掌握HBase,能为面试和实际工作中的大数据处理提供坚实基础。
50 3
|
5月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
87 0
|
7月前
|
存储 分布式计算 NoSQL
|
11月前
|
SQL 存储 大数据
大数据技术之HBase5
大数据技术之HBase5
104 0
|
11月前
|
存储 SQL 缓存
大数据技术之HBase4
大数据技术之HBase4
125 0
|
11月前
|
存储 缓存 监控
大数据技术之HBase3
大数据技术之HBase3
209 0
|
11月前
|
SQL 大数据 分布式数据库
大数据技术之HBase2
大数据技术之HBase2
100 0
|
9月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
147 0
|
20天前
|
分布式计算 监控 Hadoop
Ganglia监控Hadoop与HBase集群
Ganglia监控Hadoop与HBase集群
|
20天前
|
存储 分布式计算 Hadoop
基于Hadoop分布式数据库HBase1.0部署及使用
基于Hadoop分布式数据库HBase1.0部署及使用