Stripe Compaction
借鉴于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_ICT在Binospace个人技术博客原创,原文链接为http://www.binospace.com/index.php/hbase-new-features-stripe-compaction,未经允许,不得转载。
Stripe Compaction的更多相关文章
- hbase实践之flush and compaction
本文主要涉及flush流程,探讨flush流程过程中引入的问题并阐述2种解决策略,最后简要说明Flush执行策略. 对于Compaction,本文主要探讨Compaction要解决的本质问题以及由Co ...
- HBase in 2013
2013年马上就要过去了,总结下这一年HBase在这么一年中发生的主要变化.影响最大的事件就是HBase 0.96的发布,代码结构已经按照模块化release了,而且提供了许多大家迫切需求的特点.这些 ...
- HBase最佳实践 - 集群规划
本文由 网易云发布. 作者:范欣欣 本篇文章仅限本站分享,如需转载,请联系网易获取授权. HBase自身具有极好的扩展性,也因此,构建扩展集群是它的天生强项之一.在实际线上应用中很多业务都运行在一个 ...
- 你想要的 HBase 原理都在这了
目录 一. 集群架构 集群角色 工作机制 二.存储机制 A. 存储模型 B. LSM 与 Compaction C. Region 分裂 D. 自动均衡 三.访问机制 四. 鉴权 五. 高可靠 1.集 ...
- HBase版本进化史及大版本特性
HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...
- Rocksdb Compaction原理
概述 compaction主要包括两类:将内存中imutable 转储到磁盘上sst的过程称之为flush或者minor compaction:磁盘上的sst文件从低层向高层转储的过程称之为compa ...
- leveldb源码分析--SSTable之Compaction
对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...
- RocksDB笔记 - Compaction中的Iterator
Compaction中的Iterator 一般来说,Compaction的Input涉及两层数据的合并,对于涉及到的每一层数据: 如果是level-0,对level-0的每一个sstable文件建立一 ...
- CodeForces 219C Color Stripe
Color Stripe Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submi ...
随机推荐
- java虚拟机参数设置 jvm参数设置
java进程命令行使用方式如下: java [-options] class [args...] -options 表示虚拟机的启动参数, class为带有main()函数的java类的全名称 arg ...
- shell入门之流程控制语句
1.case 脚本: #!/bin/bash #a test about case case $1 in "lenve") echo "input lenve" ...
- 深入理解Express.js
转自:http://xvfeng.me/posts/understanding-expressjs/ 英文原文更赞:http://evanhahn.com/understanding-express- ...
- Objc将数据写入iOS真机的plist文件中
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 如何写入模拟器的博文在 这里 但是这对真机不管用,因为在真机环 ...
- LINUX0.11 内核阅读笔记
一.源码目录 图1 二.系统总体流程: 系统从boot开始动作,把内核从启动盘装到正确的位置,进行一些基本的初始化,如检测内存,保护模式相关,建立页目录和内存页表,GDT表,IDT表.然后进入main ...
- Android原生嵌入React Native
1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们i ...
- android的Drawable详解
Drawable简介 Drawable有很多种,用来表示一种图像的概念,但他们又不完全是图像,他们是用过颜色构建出来的各种图像的表现形式.Drawable一般都是通过xml来定义的 ,当然我们也可以通 ...
- Java创建柱状图及饼状图
Java创建图表其实还是很方便的,但是要引入相关的jar包.如下 jfreechart.jar jcommon,jar gnujaxp.jar 其中最主要的是jfreechart.jar. 下面就让我 ...
- 小强的HTML5移动开发之路(20)——HTML5 Web SQL Database
来自:http://blog.csdn.net/dawanganban/article/details/18220761 一.Web Database介绍 WebSQL数据库API实际上不是HTML5 ...
- android官方技术文档翻译——设计时布局属性
本文译自androd官方技术文档<Designtime Layout Attributes>:http://tools.android.com/tips/layout-designtime ...