借鉴于LevelDB、Cassandra的Compaction方法,https://issues.apache.org/jira/browse/HBASE-7667 提出了Stripe Compaction的方法。

Motivation:

1)过多Region会增大RS维护的开销,降低RS的读写性能。随着数据量的增大,在一定程度上增加Region个数,会提高系统的吞吐率。然而,RS上服务的Region个数增多,增加了RS下内存维护的开销,尤其每个Store下都配置有一个MemStore,从而会造成频率更高的Flush操作,影响系统的读写性能。因此,如果能够提出更轻量级的mini-Region,不仅能够降低服务多个Region的开销,而且能够提升读写数据的效率。

2) Region Compaction容易”放大”。例如,Region区间为[1FFF,2FFF),在该区间内仅有[1FFF,21FF)区间有大量的写操作(put、delete),但是,在触及MajorCompaction条件时,却需要对所有的文件执行Major Compaction,从而引起大量的IO。

3) Region Split操作代价较大。

需要了解之前HBase的Compaction与Flush过程,可以参考:HBaseCompaction机制 以及 HBase
Flush对读写的影响

Stripe-Compaction设计的核心思想:

1)对于Region下的rowkey区间进行二次切分,例如[1FFF,2FFF),切分成[1FFF,24FF),[24FF,2FFF)两个区间,每个区间成为Stripe。

2)Region下的数据文件分为Level-0和Level-1两层。其中Level-0主要用来存储临时的数据文件(例如使用bulkload或者执行mem flush操作之后的数据), Level-1层的数据是按照Stripe的分区来区分。

3)支持两种方式的配置:Mini-regions的个数设置、或者以Size-based为大小触发因子的自动切分机制。

4)容错机制。如果在Stripes之间存在空洞。那么可以根据在Store当中的设置,将所有的处于Level-1层的文件回归到Level-0重新进行compaction。

5)Get操作时,一个Row所涉及到文件有:MemStore、Level-0下所有文件、以及Level-1下对应Stripe区下的文件。根据Stack的意见,最终Level-0下的文件只是一个暂时的状态,大部分文件都位于Level-1 Stripe下,因此,这样随机读时,需要涉及到的文件更聚集。

6)Scan操作时,需要定位startrow即可。在扫描过程中,会按照Stripe的row区间的排序,依次进行。

7)Compaction,是Level-0上升到Level-1的过程,同时,在Level-1层次的数据,也会进行相关的合并。

8)在Split操作时,定位Rowkey区间的中心点,可以根据Stripe记录的位置,进一步查找,因此,使用预置的Stripe会有利于Split操作的进行,可以实现多数HFile文件直接拷贝到子Region目录,从而加快了Split操作的效率。

下面对于Cassandra以及LevelDB中使用的多层次Compaction算法做一个介绍。

1)分层式压缩方式将数据分成条个层,最底层的叫L0,其上分别是L1,L2….,每一层的数据大小是其上的那一层数据最大大小的10倍,其中最底层L0的大小为5M (可以配置)

2) 当level层次大于0时,同一层的各个文件之间的Rowkey区间不会重叠。所以在level n与level n+1的数据块进行合并时,可以明确的知道某个key值处在哪个数据块中,可以一个数据块一个数据块的合并,合并后生成新块就丢掉老块。不用一直到所有合并完成后才能删除老的块。

3)整体执行流程是从L0->L1->L2,依次合并的过程,如下图所示。

由上图,我们可以得知,越是level较低的块,它的数据就越新,在满足向下归约合并的过程中,就会按照文件的Rowkey的区间,进行合并,去除多余的版本,或者执行相关删除操作。因此,在读请求最极端的情况下,从Level0开始读数据,一直读到最下层Level
n。

这种Compaction的优势在于:

1)大部分的读操作如果有LRU特性,都会落入较低的Level上。因此,数据越"热",Level就越低。从而有利于未来HFile多种存储介质的定位问题。

2)在合并的过程中,仅需在由上到下的部分文件参与,而不是要对所有文件执行Compaction操作。这样会加快Compaction执行的效率。

劣势在于,如果层次太多,在递归合并的过程中,容易造成某个区间的Compaction风暴,影响该区间数据操作的吞吐。

因此,HBase-Stripe Compaction的方案中,只有两层,Level 0和Level1,这种方法在保留分层压缩的优势的同时,降低了总文件个数,有利于RS执行Split、Merge等操作。

参考文献:

[1] HBase-7667 https://issues.apache.org/jira/browse/HBASE-7667

本系列文章属于Binos_ICTBinospace个人技术博客原创,原文链接为http://www.binospace.com/index.php/hbase-new-features-stripe-compaction,未经允许,不得转载。

Stripe Compaction的更多相关文章

  1. hbase实践之flush and compaction

    本文主要涉及flush流程,探讨flush流程过程中引入的问题并阐述2种解决策略,最后简要说明Flush执行策略. 对于Compaction,本文主要探讨Compaction要解决的本质问题以及由Co ...

  2. HBase in 2013

    2013年马上就要过去了,总结下这一年HBase在这么一年中发生的主要变化.影响最大的事件就是HBase 0.96的发布,代码结构已经按照模块化release了,而且提供了许多大家迫切需求的特点.这些 ...

  3. HBase最佳实践 - 集群规划

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限本站分享,如需转载,请联系网易获取授权. HBase自身具有极好的扩展性,也因此,构建扩展集群是它的天生强项之一.在实际线上应用中很多业务都运行在一个 ...

  4. 你想要的 HBase 原理都在这了

    目录 一. 集群架构 集群角色 工作机制 二.存储机制 A. 存储模型 B. LSM 与 Compaction C. Region 分裂 D. 自动均衡 三.访问机制 四. 鉴权 五. 高可靠 1.集 ...

  5. HBase版本进化史及大版本特性

    HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...

  6. Rocksdb Compaction原理

    概述 compaction主要包括两类:将内存中imutable 转储到磁盘上sst的过程称之为flush或者minor compaction:磁盘上的sst文件从低层向高层转储的过程称之为compa ...

  7. leveldb源码分析--SSTable之Compaction

    对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...

  8. RocksDB笔记 - Compaction中的Iterator

    Compaction中的Iterator 一般来说,Compaction的Input涉及两层数据的合并,对于涉及到的每一层数据: 如果是level-0,对level-0的每一个sstable文件建立一 ...

  9. CodeForces 219C Color Stripe

    Color Stripe Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submi ...

随机推荐

  1. maven配置详解

    什么是pom?     pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...

  2. [struts2学习笔记] 第六节 struts2依赖的jar包还有Could not find action or result 错误解决

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/43272061 本文作者:sushengmiyan ------------------ ...

  3. Hibernate缓存集成IMDG

    1 第三方缓存插件 除了Ehcache这种轻量级的缓存方案外,几乎所有IMDG产品都提供了对Hibernate二级缓存的直接支持,常用的有: Ø  Hazelcast Ø  GridGain Ø  J ...

  4. JSP1.x 自定义标签

    Tag接口 任何一个标签都对应着一个java类,该类必须实现Tag接口,JSP遇到一个标签后后,将通过一个tld文件查找该标签的实现类,并运行该类的相关方法 import javax.servlet. ...

  5. Struts2中的struts.multipart.saveDir的配置

    <constant name="struts.multipart.saveDir" value="D:\\AsimsTemp"></const ...

  6. windows与linux的文件夹共享

    公司配备了一台性能还算不错的电脑,不过是台式机.我在上面装了ubuntu,但是我的代码工作目录全部都在我自己的win7笔记本上.有时程序开多了就容易卡,于是想到用装ubuntu的台式机来访问我win7 ...

  7. jdbcTemplate的queryForList

    jdbcTemplate的queryForList的使用方法如下,它不一样的地方是,它获得的结果,会再放到一个map里去: List rows = jdbcTemplate.queryForList( ...

  8. Android初级教程理论知识(第五章页面跳转和数据传递)

    总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...

  9. Activity, Service,Task, Process and Thread之间的关系

    Activity, Service,Task, Process and Thread之间到底是什么关系呢? 首先我们来看下Task的定义,Google是这样定义Task的:a task is what ...

  10. 海量数据挖掘MMDS week6: MapReduce算法(进阶)

    http://blog.csdn.net/pipisorry/article/details/49445519 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...