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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 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

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

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库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
相关文章
|
8月前
|
存储 分布式计算 大数据
HBase分布式数据库关键技术与实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析了HBase的核心技术,包括数据模型、分布式架构、访问模式和一致性保证,并探讨了其实战应用,如大规模数据存储、实时数据分析及与Hadoop、Spark集成。同时,分享了面试经验,对比了HBase与其他数据库的差异,提出了应对挑战的解决方案,展望了HBase的未来趋势。通过Java API代码示例,帮助读者巩固理解。全面了解和掌握HBase,能为面试和实际工作中的大数据处理提供坚实基础。
492 3
|
8月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
169 0
|
7月前
|
存储 大数据 分布式数据库
使用Apache HBase进行大数据存储:技术解析与实践
【6月更文挑战第7天】Apache HBase,一个基于HDFS的列式存储NoSQL数据库,提供高可靠、高性能的大数据存储。其特点是列式存储、可扩展至PB级数据、低延迟读写及多版本控制。适用场景包括大规模数据存储、实时分析、日志存储和推荐系统。实践包括集群环境搭建、数据模型设计、导入、查询及性能优化。HBase在大数据存储领域扮演关键角色,未来有望在更多领域发挥作用。
|
7月前
|
存储 SQL 分布式计算
技术心得记录:深入学习HBase架构原理
技术心得记录:深入学习HBase架构原理
|
7月前
|
存储 缓存 分布式计算
必知的技术知识:Hbase配置(伪分布式模式)
必知的技术知识:Hbase配置(伪分布式模式)
770 0
|
8月前
|
存储 分布式计算 Java
大数据存储技术(3)—— HBase分布式数据库
大数据存储技术(3)—— HBase分布式数据库
2166 0
|
存储 分布式计算 NoSQL
HBase技术
HBase技术
|
4月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
131 4
|
3月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
97 4
|
3月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
46 3