1 Compaction介绍
1.1什么是    Compaction     
    在HBase中,每当memstore的数据flush到磁盘后,就形成一个storefile,当storefile的数量越来越大时,会严重影响HBase的读性能 ,所以必须将过多的storefile文件进行合并操作。Compaction是Buffer-flush-merge的LSM-Tree模型的关键操作,主要起到如下几个作用:
(1)合并文件
(2)清除删除、过期、多余版本的数据
(3)提高读写数据的效率

1.2HBase中实现了两种compaction的方式:minor and major. 
Minor compactions will usually pick up a couple of the smaller adjacent StoreFiles and rewrite them as one. Minors do not drop deletes or expired cells, 
only major compactions do this. Sometimes a minor compaction will pick up all the StoreFiles in the Store and in this case it actually promotes itself to being a major compaction.

1.3这两种compaction方式的区别是:
<1> Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。
<2>Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。
2 Compaction执行流程及核心算法
        在HBase实现中,通过CompactionChecker线程来定时检查是否需要执行compaction,同时每当RegionServer发生一次memstore flush操作之后也会进行检查是否需要进行compaction操作。具体的执行流程通过下面的章节进行展开。

2.1  Compaction执行流程
2.1.1  HRegionServer启动流程

在regionserver的启动过程中,与compact相关的主要是在initializeThreads() 和 startServiceThreads()部分,在initializeThreads()中,主要是初始化了compact处理线程CompactSplitThread和compact检查线程CompactionChecker。线程CompactionChecker每隔10000秒检查一次是否需要进行Compact,当需要进行Compact的时候,CompactSplitThread开始处理每一个Compact请求。

2.1.2  CompactionChecker执行流程

Compact检查线程每隔10000秒(可配置)开始检查当前Regionserver下的Region是否需要进行Compact,检查的过程是遍历每个Region,然后遍历该Region下的每个store,然后判断该store是否需要进行Compact,判断的标准是:

(storefiles.size() - filesCompacting.size()) > minFilesToCompact

即:当前store下storefile数量减去正在进行Compact的storefile的数量 大于 minFilesToCompact(可配置)值的时候 需要进行Compact,那么就开启一个CompactSplitThreads线程开始处理。如果上述判断失败,检查线程还会判断是否需要进行major_compact,如果需要,还要根据Compact的优先级开始不同优先级的CompactSplitThreads线程进行处理。

2.1.3  CompactSplitThread执行流程

CompactSplitThread处理线程初始化两个线程池:largeCompactions和smallCompactions,这两个线程池的线程数目都是可以配置的。线程池初始化完毕之后,在一个store里选择需要Compact的storefile,选择完毕后封装成一个CompactRequest请求。在执行该请求之前,需要判断选择那个线程池进行处理,选择判断的方式是:

s.throttleCompaction(cr.getSize())? largeCompactions : smallCompactions

即:如果需要compact的storefile的size大于配置值的情况下选择largeCompactions线程,反之。在具体处理线程池选择完毕之后,开始执行Compact过程,pool.execute(cr),即一个CompactRequest请求是一个继承Runnable的类,他实现了run()方法,具体的执行流程在下一章节描述。

2.1.4  CompactionRequest 执行流程

一个CompactRequest的处理过程是从r.compact()开始的,当一个Region的compact过程处理完毕之后,还需要判断是否需要迭代执行Compact,判断的条件是:

this.blockingStoreFileCount - this.storefiles.size()<=0

blockingStoreFileCount小于等于当前store下storefile的数量时,还需要继续进行compact,即需要将每个的store下的storefile的数量保持在blockingStoreFileCount(可配置)以下。

Region的compact函数最终调用的是store的compact函数,而每个store类都有一个compactor实例,Compactor类包含了compact算法的具体实现过程。
3 Compact参数调优
通过整理Hbase compact的流程,可以发现很多与compact相关的参数可以进行调整。具体参数如下所示:

参数名
含义
默认值
调优配置
hbase.hregion.majorcompaction
majorCompaction自动执行的时间间隔
86400000 s
0
hbase.hstore.compaction.min
(hbase.hstore.compactionThreshold)

触发compaction的参数
3
4
hbase.hstore.compaction.max
每次Compact合并文件数的上限
10

hbase.hstore.blockingStoreFiles
st在storefile数量的上限
7
最大值
hbase.hstore.compaction.throughput.lower.bound                                 
compaction的larger线程组线程数
3
68157440
hbase.regionserver.thread.compaction.small

smallCompaction线程池的线程数
1
3
hbase.regionserver.thread.compaction.large
largeCompaction 线程池的线程数

1
3
hbase.hstore.compaction.kv.max
compaction过程中,每次从Hfile中读取kv的个数                                 
10
不发生oom情况下,可以调大
hbase.hstore.compaction.min.size
选取Compaction文件时的参数值
memstore.flush.size

hbase.regionserver.thread.compaction.throttle
判断选择那个线程池
2 * minFilesToCompact * memstoreFlushSize                                 
10737418240
hbase.server.thread.wakefrequency

每隔一定时间检查是否需要进行compaction
10000s
为了减少compact,是否可以调高?

对于以上配置,都是与Compaction相关的参数,在保证读性能的前提下,需要优化上述配置,以尽量减少Compaction的发生,上述配置是完全禁止了compaction,然后在实际中以手动的或者定时的方式去执行compaction。

PS:  上述的配置关闭了minor compaction,一开始 线上写压力不大,所以在凌晨的major compact做完后, 积累的storefile数量一直不多,所以没有对读造成性能影响。 后来 , 线上集群写压力上升,每天下午4,5点的时候 每个region下都有 200-500的storefile积压,业务端出现了大量的读超时。因此minor compaction关闭是错的选择,

目前修改为:  hbase.hstore.compaction.min   10   ,   hbase.hstore.blockingStoreFiles  100;  即当一个region下storefile数量到10时,开始执行minor_compact,  如果写压力很大,以至于达到100个时, block一下写(停止blocking的条件:要么小于100,要么超过配置的block time).

Hbase 的Compact相关推荐

  1. HBase的compact分析

    cxzdy 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 304  文章- 11  评论- 7 HBase是基于LSM树存储模型的分布式NoSQL数据库.LSM树对比普遍的B+树来说,能够获得 ...

  2. HBase的Compact参数设置及数据读写流程剖析-OLAP商业环境实战

    本套系列博客从真实商业环境抽取案例进行总结和分享,并给出Spark商业应用实战指导,请持续关注本套博客.版权声明:本套Spark商业应用实战归作者(秦凯新)所有,禁止转载,欢迎学习. 秦凯新的技术社区 ...

  3. hbase major compact脚本

    不同版本的hbase,list命令打印出来的东西不同,脚本要根据版本修改的,别傻乎乎的拿去就用,本人已经踩过坑了 注意对于自动balance来说, 只需要关注三个命令: balance_switch ...

  4. HBase在淘宝的应用和优化

    一.前言 hbase是从hadoop中分离出来的apache顶级开源项目.由于它很好地用java实现了google的bigtable系统大部分特性,因此在数据量猛增的今天非常受到欢迎.对于淘宝而言,随 ...

  5. HBase原理解析(转)

    本文属于转载,原文链接:http://www.aboutyun.com/thread-7199-1-1.html 前提是大家至少了解HBase的基本需求和组件. 从大家最熟悉的客户端发起请求开始讲起吧 ...

  6. HBase在淘宝的应用和优化小结

    本文来自于NoSQLFan联合作者@koven2049,他在淘宝从事Hadoop及HBase相关的应用和优化.对Hadoop.HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结,分 ...

  7. 经典Hbase面试7题(附答案)

    Hbase Hbase是怎么写数据的? HDFS和HBase各自使用场景 Hbase的存储结构 热点现象(数据倾斜)怎么产生的,以及解决方法有哪些 HBase的 rowkey 设计原则 HBase的列 ...

  8. 阿里大数据面试题集合:Hadoop+HBase+Spark+Zookeeper

    附面试思维导图: Hadoop面试题 讲述HDFS上传文件和读文件的流程? HDFS在上传文件的时候,如果其中一个块突然损坏了怎么办? NameNode的作用? 4.NameNode在启动的时候会做哪 ...

  9. 大数据Hadoop、Hive、Kafka、Hbase、Spark等框架面经

    大数据组件 学习路线: 阶段1:学习绿色箭头的知识点: 阶段2:学习红色箭头的知识点: 阶段3:学习蓝色箭头的知识点: 1 Hadoop 1.1 Hadoop1.x与Hadoop2.x的区别 1.2 ...

最新文章

  1. mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
  2. 买卖股票 状态机模型的理解
  3. 网页禁止右键代码各类代码大全
  4. struts2常见错误及解决总结
  5. Winform中实现自定义屏保效果(附代码下载)
  6. python中循环结构关键字,04.循环结构
  7. super 与 this 关键字
  8. hbase-admin:一款简陋的hbase数据查询工具(支持2.2.6)
  9. android 经纬度的范围内,在Android里如何判断一个指定的经纬度点是否落在一个多边形区域内...
  10. Apollo自动驾驶入门课程第⑩讲 — 控制(下)
  11. linux有两种工作界面,Linux 向用户提供了两种界面:用户界面和系统调用。
  12. 失去循环标签的Python,我这样实现跳出外层循环
  13. 中国物联网激荡 20 年
  14. 如何在vue项目中使用md5加密
  15. Linux 下使用Postgre中的命令,要使用postgres这个用户
  16. 基于浏览器扩展程序脚本和IDM提高下载速度
  17. 材料模拟python_关于材料计算,模拟,仿真什么区别?
  18. Android常用对话框大全——Dialog
  19. EndNote添加其他参考文献格式教程
  20. 【ARTS】01_07_左耳听风-20181224~1230

热门文章

  1. 音频技术操作(重采样,增减益,混流,编解码及实际应用)
  2. 【C++解题报告】阿克曼(Ackmann)函数
  3. 兄弟连兄弟会培训高级管理人员
  4. 苹果新规,微信面临下架?一文看懂苹果与腾讯“相亲相爱相杀”
  5. 索尼xz Android 内存,首发Android 9.0索尼新旗舰XZ2P曝光:搭载骁龙845处理器和6GB内存...
  6. 408-机组一些小知识点
  7. 【P09】低压甲类电子管混合耳放
  8. 动态规划-最长公共子序列-最长递增子序列-最大递增子序列和-miking time
  9. java狗叫_java学习(8) | 学步园
  10. pdf文件怎么修改文字