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

对于Compaction,本文主要探讨Compaction要解决的本质问题以及由Compaction引入的问题。面对Compaction带来的双刃剑,如何根据自己的业务模型合理的执行Compaciton,不同的场景可以采用不同的Compaction策略以及如何选择待合并文件。

Flush

1. Flush流程(HBase 1.*)

MemStore中的数据,达到一定的阈值,被Flush成HDFS中的HFile文件。

2. 由Flush流程而引入的问题

随着Flush次数的不断增多,HFile的文件数量也会不断增多,那这会带来什么影响?

Hontonworks测试过的随着HFile的数量的不断增多对读取时延带来的影响如上图所示,随着HFile文件增多,读取延时增大。因为查询一条记录需要读取1~N个HFile文件,文件越多,N越大,读取时间开销越大。

针对上述问题,可以减少HFile文件的数量减少读取延时,有2种解决思路:

  • 通过compation减少HFile
  • 在内存中执行一部分compaction操作,即HBase2.0中的改进。

3. Flush流程(HBase 2.0)

MemStore由一个可写的Segment,以及一个或多个不可写的Segments构成。

将一部分合并工作上移到内存。减少Hfile生成数量(4次-->1次),减少写的次数。改善IO放大问题。频繁的Compaction对IO资源的抢占,其实也是导致HBase查询时延大毛刺的罪魁祸首之一

  • 那为何不干脆调大MemStore的大小?这里的本质原因在于,ConcurrentSkipListMap在存储的数据量达到一定大小以后,写入性能将会出现显著的恶化。

在融入了In-Memory Flush and Compaction特性之后,Flush与Compaction的整体流程演变为:

4. Flush执行策略

一个Region中是否执行Flush,原来的默认行为是通过计算Region中所有Column Family的整体大小,如果超过了一个阈值,则这个Region中所有的Column Family都会被执行Flush。

而2.0版本中默认启用的Flush策略为FlushAllLargeStoresPolicy,也就是说,这个策略使得每一次 只Flush超出阈值大小的Column Family,如果都未超出大小,则所有的Column Family都会被Flush。

改动之前,一个Region中所有的Column Family的Flush都是同步的,虽然容易导致大量的小HFile,但也有好处,尤其是对于WAL文件的快速老化,避免导致过多的WAL文件。而如果这些Column Family的Flush不同步以后,可能会导致过多的WAL文件(过多的WAL文件会触发一些拥有老数据的Column Family执行Flush)。

Compaction

小范围的HFile文件合并,称之为Minor Compaction,一个列族中将所有的HFile文件合并,称之为Major Compaction。

1. HBase Compaction要解决的本质问题是什么?

减少HFile文件数量,减少文件句柄数量,降低读取时延

Major Compaction可以帮助清理集群中不再需要的数据(过期数据,被标记删除的数据,版本数溢出的数据)

2. Compaction引入的问题

Compaction会导致写入放大

如上图所示,第一个HFile经过多次minor compaction和一次major compaction后,数据被读取和写入多次。

在Facebook Messages系统中,业务读写比为99:1,而最终反映到磁盘中,读写比却变为了36:64。WAL,HDFS Replication,Compaction以及Caching,共同导致了磁盘写IO的显著放大。

3. 如何合理的执行Compaction?

compaction可以通过减少HFile的数据来降低读取延时,但是compaction次数不能过多,以控制写入放大的影响。

我们需要在读取延时(多compaction)和写入放大(少compaction)中折衷,调研自己的业务模型,合理执行Compaction

  • 业务模型参考维度:
写入数据类型/单条记录大小(是否是KB甚至小于KB级别的小记录?还是MB甚至更大的图片/小文件数据?)
业务读写比例
随着时间的不断推移,RowKey的数据分布呈现什么特点?
数据在读写上是否有冷热特点?
是否只读取/改写最近产生的数据?
是否有频繁的更新与删除?
数据是否有TTL限制?
是否有较长时间段的业务高峰期和业务低谷期?

4. 几种Compaction策略

  • Stripe Compaction

将一个Region划分为多个Stripes(可以理解为Sub-Regions),Compaction可以控制在Stripe(Sub-Region)层面发生,而不是整个Region级别,这样可以有效降低Compaction对IO资源的占用。

适合场景:rowkey是按Stripe顺序写入。

  • Date Tiered Compaction

    Date Tiered Compaction在选择文件执行合并的时候,会感知Date信息,使得Compaction时,不需要将新老数据合并在一起。

时序数据就是最典型的一个适用场景。

  • MOB Compaction

    如何存储MB级别的Blob(如图片之类的小文件)数据?

将Blob数据与描述Blob的元数据分离存储,Blob元数据采用正常的HBase的数据存储方式,而Blob数据存储在额外的MOB文件中,但在Blob元数据行中,存储了这个MOB文件的路径信息。MOB文件本质还是一个HFile文件,但这种HFile文件不参与HBase正常的Compaction流程。仅仅合并Blob元数据信息,写IO放大的问题就得到了有效的缓解。

  • Default Compaction

在选择待合并的文件时是在整个Region级别进行选择的

如果上述几种Compaction策略都无法很好的满足业务需求的话,用户还可以自定义Compaction策略,因为HBase已经具备良好的Compaction插件化机制。

5. 如何选择待合并的文件(minor compaction)

如果一次选择了过多的文件: 对于读取时延的影响时间范围可能比较长,但Compaction产生的写IO总量较低。

如果一次选择了较少的文件: 可能导致过于频繁的合并,导致写IO被严重放大。

  • RatioBasedCompactionPolicy

    f[start].size <= ratio * (f[start+1].size + ….. + f[end – 1].size)

  • ExploringCompactionPolicy

RatioBasedCompactionPolicy虽然选择出来了一种文件组合,但其实这个文件组合并不是最优的,因此它期望在所有的候选组合中,选择一组性价比更高的组合,性价比更高的定义为:文件数相对较多,而整体大小却较小。这样,即可以有效降低HFiles数量,又可能有效控制Compaction所占用的IO总量。

RatioBasedCompactionPolicy仅仅是在自定义的规则之下找到第一个”可行解“即可,而ExploringCompactionPolicy却在尽可能的去寻求一种自定义评价标准中的”最优解“。

请一定要结合实际的业务场景,选择合理的Compaction策略,通过不断的测试和观察,选择合理的配置,何谓合理?可以观察如下几点:
1. 写入吞吐量能否满足要求。随着时间的推移,写入吞吐量是否会不断降低?
2. 读取时延能否满足要求。随着时间的推移,读取时延是否出现明显的增大?
3. 观察过程中,建议不断的统计分析Compaction产生的IO总量,以及随着时间的变化趋势。

参考文献

一条数据的HBase之旅,简明HBase入门教程-Flush与Compaction

hbase实践之flush and compaction的更多相关文章

  1. HBase写入性能及改造——multi-thread flush and compaction(续:详细测试数据)[转]

    转载:http://blog.csdn.net/kalaamong/article/details/7290192 接上文啊: 测试机性能 CPU 16* Intel(R) Xeon(R) CPU   ...

  2. hbase实践之数据读取详解

    hbase基本存储组织结构与数据读取组织结构对比 Segment是Hbase2.0的概念,MemStore由一个可写的Segment,以及一个或多个不可写的Segments构成.故hbase 1.*版 ...

  3. hbase实践之写流程拾遗

    keyvalue KeyValue中包含了丰富的自我描述信息: KeyValue是支撑"稀疏矩阵"设计的一个关键点:一些Key相同的任意数量的独立KeyValue就可以构成一行数据 ...

  4. HBase实践案例:车联网监控系统

    项目背景 本项目为车联网监控系统,系统由车载硬件设备.云服务端构成.车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端.服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验 ...

  5. HBase实践案例:知乎 AI 用户模型服务性能优化实践

    用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...

  6. hbase实践之协处理器Coprocessor

    HBase客户端查询存在的问题 Scan 用Get/Scan查询数据, Filter 用Filter查询特定数据 以上情况只适合几千行数据以及不是很多的列的"小数据". 当表扩展为 ...

  7. hbase实践之Rowkey设计之道

    笔者从一开始接触hbase就在思考rowkey设计,希望rowkey设计得好,能够支持查询的需求.使用hbase一段时间后,再去总结一些hbase的设计方法,无外乎以下几种: reverse salt ...

  8. hbase实践之HFile结构

    本文目录如下所示: 目录 HFile在HBase架构中的位置 什么是HFile HFile逻辑结构 HFile逻辑结构的优点 HFile物理结构 HFile生成流程 HFile中Block块解析 多大 ...

  9. hbase实践之rowkey设计

    rowkey设计的重要性 rowkeys是HBase表设计中唯一重要的一点. rowkey设计要求 唯一性 存储特性 按照字典顺序排序存储 查询特性 由于其存储特性导致查询特性: 查询单个记录: 查定 ...

随机推荐

  1. Oracle 数据库 alert日志及trace日志的清理

    Oracle 数据库 alert日志及trace日志的清理 方案一: 暂停数据库的trace 登录到数据库 sqlplus / as sysdba 修改参数: SQL> alter system ...

  2. 《Tsinghua os mooc》第15~16讲 处理机调度

    第十五讲 处理机调度 进程调度时机 非抢占系统中,当前进程主动放弃CPU时发生调度,分为两种情况: 进程从运行状态切换到等待状态 进程被终结了 可抢占系统中,中断请求被服务例程响应完成时发生调度,也分 ...

  3. Git使用两个用户名两个公钥链接同一个Git服务器

    同篇文章以Gitee举例, 支持国产, 首先关联一下我的另外一篇文章: 在码云上添加公钥时提示不允许重复添加(实际上当前公钥数为0) 在这篇文章中, 我后续有补充解释为什么会出现我之前没有弄明白的这个 ...

  4. 习题一初步理解时间复杂度大O表示法案例

    1.如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 如上:a+b+c=1000, a平方+b平方=c平方  求出所有abc可能的组合 ...

  5. 使用网关zuul过滤器登录鉴权

    使用网关zuul过滤器登录鉴权     1.新建一个filter包         filte有很多种 pre.post.     2.新建一个类LoginFilter,实现ZuulFilter,重写 ...

  6. WUSTOJ 1365: 矩阵旋转(Java)

    题目链接:

  7. 1255: 打怪升级(Java)

    WUSTOJ 1255: 打怪升级 Description 对于多数RPG游戏来说,除了剧情就是打怪升级.本题的任务是用最短的时间取得所有战斗的胜利.这些战斗必须按照特定的顺序进行,每打赢一场,都可能 ...

  8. image analogies笔记

    Image Analogies 个人学习笔记, 根基尚浅, 免不得颇多纰漏, 望批评指教. 这是一篇2001年的文章, 其核心主要讲了如何将一对图片之间的"转换模式"应用到其他图片 ...

  9. SVN操作出现locked错误解决办法

    SVN操作出现locked错误解决办法:在SVN中执行 commit 操作时,在更新过程中,中断过,或者因为其他原因导致SVN 出现 locked 异常. 解决办法:1. 选中出现异常的文件,右键 - ...

  10. BOM与DOM的区别与联系

    一.BOM与DOM的区别 1.BOM(Browser Object Model) BOM 即浏览器对象模型,BOM没有相关标准,BOM的最核心对象是window对象.window对象既为javascr ...