深入分析HBase Compaction机制

2023-10-27

Compaction介绍

Compaction是buffer->flush->merge的Log-Structured Merge-Tree模型的关键操作,主要起到如下几个作用:

1)合并文件

2)清除删除、过期、多余版本的数据

3)提高读写数据的效率

Minor & Major Compaction的区别

1)Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。

2)Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

从这个功能上理解,Minor Compaction也不适合做Major的工作,因为部分的数据清理可能没有意义,例如,maxVersions=2,那么在少部分文件中,是否是kv仅有的2个版本也无法判断。

下面是引用:

There are two types of compactions: 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.

After a major compaction runs there will be a single StoreFile per Store, and this will help performance usually. Caution: major compactions rewrite all of the Stores data and on a loaded system, this may not be tenable; major compactions will usually have to be done manually on large systems.

Compaction诱发因子

在什么情况下会发生Compaction呢?

参数名 配置项 默认值
minFilesToCompact hbase.hstore.compactionThreshold 3
maxFilesToCompact hbase.hstore.compaction.max 10
maxCompactSize hbase.hstore.compaction.max.size Long.MAX_VALUE
minCompactSize hbase.hstore.compaction.min.size memstoreFlushSize

 

CompactionChecker是RS上的工作线程(Chore),设置执行周期是通过threadWakeFrequency指定,大小通过hbase.server.thread.wakefrequency配置(默认10000),然后乘以默认倍数multiple(1000),毫秒时间转换为秒。因此,在不做参数修改的情况下,CompactionChecker大概是2hrs, 46mins, 40sec执行一次。

首先,对于HRegion里的每个HStore进行一次判断,needsCompaction()判断是否足够多的文件触发了Compaction的条件。

条件为:HStore中StoreFIles的个数 – 正在执行Compacting的文件个数 > minFilesToCompact

操作:以最低优先级提交Compaction申请。

 

步骤1:选出待执行Compact的storefiles。由于在Store中的文件可能已经在进行Compacting,因此,这里取出未执行Compacting的文件,将其加入到Candidates中。

步骤2:执行compactSelection算法,在Candidates中选出需要进行compact的文件,并封装成CompactSelection对象当中。

1) 选出过期的store files。过滤minVersion=0,并且storefile.maxTimeStamp + store.ttl < now_timestamp。这意味着整个文件最大的时间戳的kv,都已经过期了,从而证明整个storefile都已经过期了。CompactSelection如果发现这样的storefile,会优先选择出来,作为Min然后提交给Store进行处理。

这部分具体操作被封装在ScanQueryMatcher下的ColumnTracker中,在StoreScanner的遍历过程,ScannerQueryMatcher负责kv的过滤。这里的ScanType包括(MAJOR_COMPACT,MINOR_COMPACT,USER_SCAN),compact操作是对选出的文件执行一次标识ScanType为MAJOR_COMPACT或者MINOR_COMPACT类型的scan操作,然后将最终符合标准的kv存储在一个新的文件中。

应用重要参考:根据应用的需求设置ttl,并且设置minVersions=0,根据selectCompation优选清理过期不保留版本的文件的策略,这样会使得这部分数据在CompactionChecker的周期内被清理。

误区:在CompactSplitThread有两个配置项

hbase.regionserver.thread.compaction.large:配置largeCompactions线程池的线程个数,默认个数为1。

hbase.regionserver.thread.compaction.small:配置smallCompactions线程池的线程个数,默认个数为1。

这两个线程池负责接收处理CR(CompactionRequest),这两个线程池不是根据CR来自于Major Compaction和Minor Compaction来进行区分,而是根据一个配置hbase.regionserver.thread.compaction.throttle的设置值(一般在hbase-site.xml没有该值的设置),而是采用默认值2 * minFilesToCompact * memstoreFlushSize,如果cr需要处理的storefile文件的大小总和,大于throttle的值,则会提交到largeCompactions线程池进行处理,反之亦然。

应用重要参考:可以稍微调大一些largeCompactions和smallCompactions线程池内线程的个数,建议都设置成5。

2) 判断是否需要进行majorCompaction,这是很多判断条件的合成,其中最为重要的一个是
hbase.hregion.majorcompaction设置的值,也就是判断上次进行majorCompaction到当前的时间间隔,如果超过设置值,则满足一个条件,同时另外一个条件是compactSelection.getFilesToCompact().size() < this.maxFilesToCompact。

因此,通过设置hbase.hregion.majorcompaction = 0可以关闭CompactionChecke触发的major compaction,但是无法关闭用户调用级别的mc。

3) 过滤对于大文件进行Compaction操作。判断fileToCompact队列中的文件是否超过了maxCompactSize,如果超过,则过滤掉该文件,避免对于大文件进行compaction。

4) 如果确定Minor Compaction方式执行,会检查经过过滤过的fileToCompact的大小是否满足minFilesToCompact最低标准,如果不满足,忽略本次操作。确定执行的Minor Compaction的操作时,会使用一个smart算法,从filesToCompact当中选出匹配的storefiles。

具体算法为:

如果fileSizes[start] > Math.max(minCompactSize, (long)(sumSize[start+1]*r ),那么继续start++。这里r的含义是compaction比例,它有如下四个参数控制:

配置项 默认值 含义
hbase.hstore.compaction.ratio 1.2F  
hbase.hstore.compaction.ratio.offpeak 5.0F 与下面两个参数联用
hbase.offpeak.start.hour -1 设置hbase offpeak开始时间[0,23]
hbase.offpeak.end.hour -1 设置hbase offpeak结束时间 [0,23]

如果默认没有设置offpeak时间的话,那么完全按照hbase.hstore.compaction.ration来进行控制。如下图所示,如果filesSize[i]过大,超过后面8个文件总和*1.2,那么该文件被认为过大,而不纳入minor Compaction的范围。


Figure 1 Minor Compaction File Selection Algorithm

 

这样做使得Compaction尽可能工作在最近刷入hdfs的小文件的合并,从而使得提高Compaction的执行效率。

 

5) 通过selectCompaction选出的文件,加入到filesCompacting队列中。

6) 创建compactionRequest,提交请求。

 

总结:

在大多数情况下,Major是发生在storefiles和filesToCompact文件个数相同,并且满足各种条件的前提下执行。这里进行几个参数配置的简介:

hbase.hregion.majorcompaction: 设置系统进行一次MajorCompaction的启动周期,如果设置为0,则系统不会主动触发MC过程。

hbase.hstore.compaction.max:设置执行Compaction(包括Major &Minor)的待合并文件的最大个数。默认值为10,如果超过该设置值,会对部分文件执行一次MinorCompaction,选择算法如Figure1。

hbase.hstore.compactionThreshold: 设置执行Compaction(Major && Minor)操作的阈值,默认是3,如果想降低过频繁的合并操作,可以稍微调大一点,对于HBase负载较重的系统,可以设置成5。

 

Compaction对于读写操作的影响

Compaction与Flush不同之处在于:Flush是针对一个Region整体执行操作,而Compaction操作是针对Region上的一个Store而言,因此,从逻辑上看,Flush操作粒度较大。这属于一个LSM存储模型最核心的设计:

1)Flush操作如果只选择某个Region的Store内的MemStore写入磁盘,而不是统一写入磁盘,那么HLog上key的一致性在Reigon不同ColumnFamily(Store)下的MemStore内就会有不一致的key区间。

如下图所示,我们假定该RegionServer上仅有一个Region,由于不同的Row是在列簇上有所区别,就会出现有些不同Store内占用的内存不一致的情况,这里会根据整体内存使用的情况,或者RS使用内存的情况来决定是否执行Flush操作。如果仅仅刷入使用内存较大的memstore,那么在使用的过程中,一是Scan操作在执行时就不够统一,二是在HLog Replayer还原Region内Memstore故障前的状态,只需根据Hlog的Flush_marker的标记位来执行Replay即可。

2)Compaction执行结束之后会生成临时文件,临时文件所在的hdfs位置如下:

/hbase-weibo/bi_weibo_cluster/ffd87a50c3df3080183d4910d183d0ee/.tmp

ffd87a50c3df3080183d4910d183d0ee 是bi_weibo_cluster表格的Region名。临时文件的意义在于,在Compaction执行期间,对于原数据访问没有影响。Compaction执行合并操作生成的文件生效过程,需要对Store的写操作加锁,阻塞Store内的更新操作,直到更新Store的storeFiles完成为止。(注意,这个操作过程执行会影响到更新服务,但是影响不会太大)

 

3)对于读服务的影响,类似于Flush操作,也是通过ChangedReaderObserver为StoreScanner注册监听类来实现的。具体内容可以参考之前的”HBase Flush操作流程以及对读写服务的影响”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入分析HBase Compaction机制 的相关文章

随机推荐

  • forEach 中的 return 到底有效吗?如何优雅地中断 forEach 循环?

    在JavaScript中 forEach是一个常用的数组遍历方法 然而 很多人可能误解了forEach中的return语句的作用 本文将详细解释forEach中的return是否有效以及如何优雅地中断forEach循环 forEach 中的
  • swagger主页访问报错500

    背景 有一天前端给我要接口文档 我给发了个接口文档路径 结果直接报错500 截图如下 原因分析 500报错 看后台日志 java lang NullPointerException null at springfox documentati
  • R语言之函数调用

    处理数据对象的实用函数 函 数 功 能 length object 显示对象中元素 成分的数量 dim object 显示对象的维度 str object 显示对象的结构 class object 显示对象的类型 mode object 显
  • 还在为数据清洗抓狂?这里有一个简单实用的清洗代码集

    选自towardsdatascience 作者 Admond Lee 机器之心编译 参与 Geek AI 张倩 数据清洗是数据科学家逃不掉的一份苦差事 为了让这项工作不那么痛苦 本文作者分享了自己的数据清洗代码集 现实世界中的数据通常质量不
  • 听说你还不知道什么是 python?带你深入理解什么是 python

    文章目录 前言 什么是python python的由来 我们为什么要学习python 帮助python学习的网站 前言 各位朋友们 大家好 在之后的时间里 我将陆续为大家分享我在python学习过程中学习到的知识点 如果你也对python感
  • 【随机过程】 17 -离散时间马氏链典型应用

    离散时间马尔科夫链的典型应用 文章目录 离散时间马尔科夫链的典型应用 0 概述 1 Page Rank 1 1 背景 1 2 模型建立 1 3 模型求解 2 MCMC 2 1 概述 2 2 实现思路 2 3 具体实现 2 3 1 第一步 细
  • Qt基础之五:使用invokeMethod异步调用函数

    在主线程中如果执行比较耗时的任务 但是又不想单独开子线程来处理 不妨试试Qt中提供QMetaObject invokeMethod方法 该方法支持函数的异步调用 这样就会在界面显示后去执行 而不会卡主主界面 QMetaObject invo
  • [linux-sd-webui]图生文,blip/deepbooru

    GitHub pharmapsychotic clip interrogator Image to prompt with BLIP and CLIPImage to prompt with BLIP and CLIP Contribute
  • 【hadoop学习之路】Spark-SQL 实验报告 RDD转DataFrame

    1 Spark SQL 基本操作 1 1 需求 将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name
  • Pandas处理日期数据

    一 pandaas日期处理的作用 将2018 01 01 1 1 2018等多种日期格式映射成统一的格式对象 在该对象上提供强大的功能支持 几个概念 1 pd to datetime pandas的一个函数 能将字符串 列表 series变
  • 数据结构——个人学习笔记

    系列目录 数据结构第一章绪论 数据结构第二章线性表 文章目录 系列目录 2 1线性表的定义和特点 2 2线性表的操作定义 2 3线性表的顺序表示和实现 线性表的重要基本操作 1 初始化线性表 参数用指针 2 插入 新增 3 取值 4 查找
  • easy modbus tcp

    public static void Main string args ModbusClient modbusClient new ModbusClient 190 201 100 100 502 Ip Address and Port o
  • Android组件化和插件化的概念,android快速开发框架

    开发单个模块时可以共享资源和工具类 可以针对单个模块测试 开发调试时不需要对整个项目进行编译 多人合作时可以只关注自己的业务模块 把某一业务当成单一项目来开发 可以灵活的对业务模块进行组装和拆分 4 组件化开发的主要思路 就是将一个Modu
  • c++求行列式的值(全排列法)

    用全排列的方式求行列式的值 递归体现在全排列中 上代码 f函数是求行列式的值 include
  • flink中通过jdbc查询结果集使用 flink table api 创建临时视图

    1 maven依赖
  • [转]QNX_HMI_crank工程的系统移植

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 开发软件 Cr
  • python如何输出多个星号_如何使用python输出连续星号?

    小编依稀记得 自己初学编程时候 第一节课 老师就给我们演示了输出连续星号内容 那时候真感叹python的神奇 重温一遍这个内容 入门小伙伴们可以来看下啦 有关语法 用嵌套打印小星星 需求 在控制台连续输出五行 每一行星号的数量依次递增 使用
  • 如何从配置文件中获取属性

    在项目中添加了一个腾讯云的短信业务 领导说要我把这个项目整合到原本的业务中去 业务那么多 怎么搞 继续询问后得知 是整合到原本的短信业务中 原本用的短信业务是短信猫来发短信 问 需要前端加传的参数吗 答 不允许 继续询问得知 是要在配置文件
  • [转]Tangram框架应用开发的一般模式

    框架其实就是一种开发模式 用tangram框架开发应用程序意味着选择一种面向接口 模块化的开发方式 这和传统的Delphi应用程序开发方式有一定区别 对于刚刚接触框架的童鞋可能不知道如何下手 因此有必要把框架的一般开发方式说明一下 不过框架
  • 深入分析HBase Compaction机制

    Compaction介绍 Compaction是buffer gt flush gt merge的Log Structured Merge Tree模型的关键操作 主要起到如下几个作用 1 合并文件 2 清除删除 过期 多余版本的数据 3