HBase的compact分析

HBase源码分析之HRegion上compact流程分析(二) 我们继续HRegion上compact流程分析,接下来要讲的是针对表中某个列簇下文件的合并,即HStore的compact()方法。 阅读详情

cxzdy

 

随笔- 304  文章- 11  评论- 7 

 

HBase是基于LSM树存储模型的分布式NoSQL数据库。LSM树对比普遍的B+树来说,能够获得较高随机写性能的同时,也能保持可靠的随机读性能(可参考这里)。在进行读请求的时候,LSM树要把多个子树(类似B+树结构)进行归并查询,对于HBase来说,这些子树就是HFile(还包括内存上的树结构MemStore)。因此归并查询的子树数越少,查询的性能就越高。

Compact的作用

在写请求的这篇文章里,已经介绍过对于每个写请求,都必须写入MemStore以及HLog才算完成事务提交。当MemStore超过阀值的时候,就要flush到HDFS上生成一个HFile。因此随着不断写入,HFile的数量将会越来越多,根据前面所述,HFile数量过多会降低读性能。为了避免对读性能的影响,可以对这些HFile进行compact操作,把多个HFile合并成一个HFile。compact操作需要对HBase的数据进行多次的重新读写,因此这个过程会产生大量的IO。可以看到compact操作的本质就是以IO操作换取后续的读性能的提高。

Compact的流程

HBase的compact是针对HRegion的HStore进行操作的。compact操作分为major和minor两种,major会把HStore所有的HFile都compact为一个HFile,并同时忽略标记为delete的KeyValue(被删除的KeyValue只有在compact过程中才真正被"删除"),可以想象major会产生大量的IO操作,对HBase的读写性能产生影响。minor则只会选择数个HFile文件compact为一个HFile,minor的过程一般较快,而且IO相对较低。在日常任务时间,都会禁止mjaor操作,只在空闲的时段定时执行。

compact入口

可以请求compact的地方有很多,包括在open region、MemStore flush等都会判断是否需要进行compact操作(单个HStore的MemStore flush之后,如果触发compact操作,则会对所属HRegion下的所有HStore分别进行compact)。除此之外,HRegionServer.CompactionChecker负责定期10 * 1000s针对所有HRegion的HStore检测是否需要进行compact操作。
CompactionChecker判断是否需要进行compact操作的条件如下:
1、HStore下还没有进行compact的HFile的总数 >= hbase.hstore.compaction.min(默认为3),则需要进行compact。
2、如果1不成立,则判断是否需要执行major compact。主要是查看一下是否太久没有执行compact操作。具体判断过程:
1)获得compact时间间隔。hbase.hregion.majorcompaction(默认7天)为base基准时间,hbase.hregion.majorcompaction.jitter(默认5.0)为jitter,公式base + jitter - Math.round(2 * jitter * randomNum) 计算出一个会每次自动抖动的数值作为major compact的时间间隔。之所以要一个自动抖动,就是避免在HRegionServer重启的时候大量的major compact出现造成大量的IO。
2)所有HFile最老(时间戳最小)的那个HFile的时间间隔大于这个major compact的时间间隔,则执行major compact。另外如果HRegion只有一个HFile,并且这个HFile的所有KeyValue的时间戳都没有超过TTL,则表示无须进行major compact,会跳过这次major compact。
当1或2成立都会分别对CompactSplitThread发送compact请求,不同的是,1会异步选择需要进行compact的HFile,2则会进行同步选择。

compact请求

CompactSplitThread是HRegionServer内负责专门执行minor compact、major compact、split、merge操作的线程池。其内部对应4个操作有不同的线程池执行对应的请求。把这些耗时较大的操作放到各自的线程池里有助于提高系统整个吞吐量,同时可以避免某个操作阻塞影响其它操作。
对于每个compact请求,CompactionChecker需要区分出major和minor,然后分配到对应的线程池执行。条件是进行compact的文件总大小 > hbase.regionserver.thread.compaction.throttle(默认2*maxFileCompacts*memstoreFlushSize=2*10*128MB),则为major compact,否则为minor compact。
选择compact的文件操作由对应的HStore进行。CompactionChecker的2会同步选择compact文件,这样就可以马上确定是哪个线程池执行具体的compact操作。但1会异步选择compact进行的HFile时,由于不知道文件总大小,HBase会首先在minor compact的线程池进行compact文件选择操作,选择操作后如果判断为需要进行major compact,则会重新把请求发送到major的线程池进行后续的compact操作。

HStore的compact文件选择

compact文件的选择首先要判断是major还是minor,如果是major,则整个HStore的所有HFile都被选中,否则就选择部分文件进行minor compact。考虑到compact操作都会耗费大量的IO,因此minor compact操作的目标就是以最少的IO代价换取最大的读性能提高。目前在新版本里,HStore的compact文件选择策略能够充分考虑了整体情况去选择最佳的方案。整个过程如下:
删除无效文件。 把超过TTL的HFile选择为compact文件。把这些文件compact记录写入WAL,通知所有执行读请求的scanner更新,更新HStore的总文件大小等。 选择compact文件。 根据选择compact文件更新内部数据。

其中选择compact文件过程是主要步骤,具体如下:

把当前HStore所有的HFile作为候选compact文件进行排除操作。排除候选HFile中比正在compact的最新文件还要老的文件。判断文件新老是比较HFile里保存的最大SequenceId(在HLog replay的过程可以判断哪些记录已经写入HFile)决定。SequenceId是HRegion把插入的KeyValue记录写入HLog时作为key一部分的单调递增ID,因此SequenceId越大,则记录越新,也就是HFile越新。排除候选HFile中超过hbase.hstore.compaction.max.size(默认Long最大值)以及非Reference文件。如果不是forceMajor则跳过这步。Reference文件是split region产生的临时文件,只是简单的引用文件,一般必须在compact过程中删除。判断是否major compact。满足用户指定的force major,或者太长时间没有进行compact(CompactionChecker的判断2)且候选文件数小于hbase.hstore.compaction.max(默认10),或者有Reference文件,满足上面三个条件之一则是major compact。minor compact继续排除操作。 1、排除在metadata里设置不进行minor compact的HFile(bulkLoad的时候设置) 2、applyCompactionPolicy(后面详述) 3、候选文件数小于hbase.hstore.compaction.min(默认3)则排除全部的候选文件排除候选文件数里超过hbase.hstore.compaction.max(默认10)的部分,如果是major compact则跳过这步,注意从最新的HFile开始进行排除,也就是如果有12个候选文件,则排除掉最后2个最新的HFile。

compact的选择过程中,主要是判断major和minor,然后在配置的最大最小相关限制下进行选择。整个步骤的重点在applyCompactionPolicy,用户可以实现自己的选择策略,HBase主要有两个策略RatioBasedCompactionPolicy和ExploringCompactionPolicy。我们首先假设一个现象:当写请求非常多,导致不断生成HFile,但compact的速度远远跟不上HFile生成的速度,这样就会使HFile的数量会越来越多,导致读性能急剧下降。为了避免这种情况,在HFile的数量过多的时候会限制写请求的速度:在每次执行MemStore flush的操作前,如果HStore的HFile数超过hbase.hstore.blockingStoreFiles (默认7),则会阻塞flush操作hbase.hstore.blockingWaitTime时间,在这段时间内,如果compact操作使得HStore文件数下降到回这个值,则停止阻塞。另外阻塞超过时间后,也会恢复执行flush操作。这样做就可以有效地控制大量写请求的速度,但同时这也是影响写请求速度的主要原因之一。

两者实现如下:

RatioBasedCompactionPolicy。 从最旧文件开始遍历到最新候选文件,找到小于[hbase.hstore.compaction.min.size(默认为memstore的flush大小,128M)和compact文件总大小*ratio 的最大值]的符合条件文件,如果发现不符合则马上停止搜索。ratio是一个可变的比例,可以通过设置高峰期的时间来改变这个比例,在高峰期时ratio为1.2,非高峰期为5,也就是非高峰期允许compact更大的文件(非高峰期可以耗费更大IO)。 目的是尽可能找到小文件进行minor compact。如果判断这个compact操作后文件数仍然过多会阻塞flush操作,则只是简单选择从最老的文件起,候选文件数减去hbase.hstore.compaction.min(默认3)个文件。 ExploringCompactionPolicy。 从最旧文件开始遍历所有的候选文件,找出符合[compact文件大小 小于 hbase.hstore.compaction.max.size(默认Long最大值)且所有文件的大小都不会超过其它文件大小*ratio]并且效率最高[compact文件数最多或compact大小最小]。ratio是高峰期比例。注意,由于存在限制,因此可能候选文件被排除到为0个,这时如果判断这个compact操作后文件数仍然过多会阻塞flush操作,则会选择hbase.hstore.compaction.min(默认3)个文件起,符合最大(Long最大值)最小compact大小(128MB)的总大小最小的一个子集合。

可见ExploringCompactionPolicy是基于所有候选文件考虑,而RatioBasedCompactionPolicy则是遍历找到就停止。ExploringCompactionPolicy是新版本的策略,旧版本的RatioBasedCompactionPolicy当时只考虑到最大的文件往往是最老的,但对于bulk-loaded的文件等某些情况则会破坏这个规则,RatioBasedCompactionPolicy的算法就不是最优的压缩策略。

完成compact文件选择后,HStore保存这次compact的结果,并返回给CompactSplitThread。

compact的执行

CompactSplitThread接下来会要求HRegion进行compact请求,HRegion会增加compact的计数值表明正在执行的compact操作,这样可以防止compact过程中,HRegion被关闭。然后HRegion调用具体HStore的compact方法执行真正的compact操作。

HStore的compact操作步骤过程,主要就是把这些HFile写成一个HFile。主要过程为:

对所有文件创建对应的scanner,Reference有特殊的scanner。scanner的层次可以参考之前的读请求,最终得到的是一个StoreScanner对象,另外如果是major compact,则会指定在scanner的时候忽略Delete的KeyValue。创建一个临时文件,循环调用scanner的next()方法,把获得的有序的KeyValue写入到临时文件中,然后把这些KeyValue最大的SequenceId写入metadata里。把写到临时文件的compact文件移动到HStore对应的存储目录。把compact的结果写入WAL,RS宕机时就可以依据WAL执行删除旧storeFile用新的compact文件更新HStore内部的数据通知执行读请求中的scanners更新读的HFile,删除旧文件(实际上将其归档),重新计算所有HFile总大小

可以看到在整个compact操作里,只有最后完成compact过程才会对读请求有影响。

完成了HStore的compact操作后,HRegion就会减去之前compact的计数值。返回到CompactSplitThread流程,如果hbase.hstore.blockingStoreFiles(默认7)减去当前的HStore的HFile数。如果<0则表示HRegion将会阻塞后续的memstore flush操作,处于stuck状态则继续调用requestSystemCompaction,否则执行requestSplit查看是否需要split。

至此,就完成了HStore的compact操作。

总结

HBase的compact操作能够通过牺牲当前的IO来获得后来的读性能提高,为了能够减轻compact对系统带来的影响,每次的compact操作都应尽可能选择IO最少,且能提升读性能最大(文件数最多),另外对于major compact,最好应该在集群空闲时间手动触发。

分类: HBase

HBase的compact流程分析 关于hbase的compact意义及其应用背景已经有很多文章做了描述,这里不再赘述,本文以1.1.2背景的hbase为例,从源码中分析hbase中compact请求发出到接受处理的流程,限于作者水平有限,分析中可能有疏漏或者错误的地方,希望大家指正,一起学习提高。 从regionserver开始分析compact的流程,regionserver初始化的时候会初始化两个与compact相关的线程分 阅读详情

相关推荐

HBase源码分析之HRegionServer上compact流程分析

前面三篇文章中,我们详细叙述了compact流程是如何在HRegion上进行的,了解了它的很多细节方面的问题。但是,这个compact在HRegionServer上是如何发起的?合并时文件是如何选择的呢?在这篇文章中,你将找到答案!         首先,在HRegionServer内部,我们发现,它定义了一个CompactSplitThread类型的成员变量compactSplitThread

辰辰爸的博客 3332

HBase source code. HRegion

配置: hbase.hregion.memstore.flush.size: 134217728 当Region的所有的memstore(意思是所有HStore的memstore的size的加总)的size超过参数设定的字节数时, 就会引发flush to disk的这个操作. 其中监听这个value是有另外一条线程在做. hbase.hregion.percolumnfamilyflush

为这个世界贡献几行代码 ~woo hoo! 1307

在银河麒麟V10 SP1上安装Wine 9.0运行Windows程序

Wine是一个面向Linux等类Unix系统的兼容层,通过将Windows API调用翻译为Linux系统调用,使Windows应用程序能够在非Windows平台上运行。在国产化迁移进程中,银河麒麟V10 SP1等操作系统常因缺少Windows软件兼容性而受到阻碍。Wine 9.0作为2024年发布的重要版本,改进了WoW64模式、Wayland支持等关键技术,为运行办公软件、行业客户端提供了可行方案。从环境检查、依赖安装、编译配置到中文字体与运行库设置,系统梳理在麒麟V10 SP1上构建Wine 9.0环

weixin_33906657的博客 442

HBase compaction了解和手动触发major_compaction方法

Major Compaction 的作用: 1.将一个Region下的所有StoreFile合并成一个StoreFile文件 2.对于删除、过期、多余版本的数据进行清除 3.提高读写数据的效率 HBase中实现了两种compaction的方式: 1.Minor compaction:只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。 2.Major compaction:是对Region下的HStore的所有StoreFile执行

c18092694487t的博客 7317

CTF-Web习题:2019强网杯 UPLOAD

本题涉及知识点:代码审计、文件上传漏洞、反序列化漏洞

LJW123487的博客 1903

国标GB28181视频平台EasyGBS国标平台设备播放断流现象的问题解决方案

于是排查代码发现,当设备网络较差时,设备会断流,超过指定的时间30s(EasyGBS平台默认值),就会主动清除流媒体服务,但是redis中的流数据还在,而当设备在录像时,自动保活会从redis中取保活流数据,所以就会出现设备状态显示正在播放,但是流已经消失的情况。有用户反馈,在安防视频监控EasyGBS运行时,接入的设备刚开始可以正常播放,开启云端录像后,也没有停止和重播的操作,但是出现了视频流断流的现象。在设备进行播放保活时,对流信息进行判断,添加一个最后的处理流时间,如果超过指定时间就自动重新拉流。

EasyNTS的博客 437

Hbase compact以及split跟踪

为了准确了解HBASE内部工作原理,我们需要做一些测试,在大量数据插入的情况下,HBASE内部到底有什么表现? 比如插入速度, hstore compact,split等相关活动,了解了这些才能更好的维护HBASE系统本身。 此次测试会有几轮,所以测试到哪里就写到哪里,我随便找了一张大概120W来的表,我会写一个mapreduce任务,来读取这张表,再写入另外一个测试表: test2, 没有选择更大的表是因为毕竟整个拷贝是需要时间,通常20分钟-30分钟,太大的表,不太利于跟踪。 拷贝过程,HBASE会

huaxia2002的博客 285

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

hbase compaction

minor compaction 会真正删除 ttl的内容 major compaction ttl 多余version

longlovefilm的博客 844

51单片机独立按键控制LED(二)

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。

m0_50562428的博客 5386

自组织映射神经网络(SOM)

目录 1 背景:自组织(竞争型)神经网络 2竞争学习的概念与原理 2.1 竞争学习的步骤 2.2 示例 3SOM典型结构 4SOM网的权值调整域 5 SOM Kohonen 学习算法 6 SOM示例 7SOM设计细节 7.1输出层设计 7.2输出层节点排列的设计 7.3 权值初始化问题 7.4学习率的设计 7.5设计拓扑领域 8SOM功能分析 8.1 保序映射 8.2数据压缩 8.3 特征提取 9自组织映射神经网络与K均值算法的区别...

weixin_39910711的博客 1万+

Hbase的MinorCompact过程解析及参数调优

在Memstore超过一定的阈值的时候,就要新开一个进程将Memstore flush到storefile中,新的Memstore继续写入接受到的数据,当storefile越来越多时,就会降低读的性能,为了提高读的性能,可以对这些storefile进行compact操作,形多个storefile合并成一个大的storefile,那么compact就需要对HBase的数据进行多次的重新读写,这将产生大量的IO操作,所以Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期

南风知我意 1870

【问题解决】Python 运行报错 `ModuleNotFoundError` 全网最全解决方案,一文搞定所有导包问题

本文全面解析Python中常见的ModuleNotFoundError和ImportError问题,提供从基础到高级的解决方案。文章首先分析问题原因,包括模块未安装、环境不一致、路径问题等,然后给出7种解决方案:安装缺失模块、检查Python环境、使用虚拟环境、添加搜索路径、相对导入、setup.py安装本地包和使用__init__.py。针对Jupyter Notebook、Docker容器等常见场景提供专门解决方案,并推荐使用requirements.txt、pipenv等预防措施。最后分享调试技巧,帮

博客 917

hbase中compact、split相应配置参数分析

1,   hbase.hregion.majorcompaction   86400000   The time (in miliseconds) between 'major' compactions of all   HStoreFiles in a region.  Default: 1 day.   Set to 0 to disable automated major co

豹先生 6138

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真

本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。

amy_mhd的博客 85

手把手教你学simulink(36.1)--ACAC变换器场景示例:基于 Simulink 的矩阵变换器(Matrix Converter)

矩阵变换器(Matrix Converter, MC)是一种直接将交流电(AC)转换为不同频率和幅值的交流电的电力电子设备。与传统的基于直流环节的变频器不同,矩阵变换器不需要中间的直流环节,而是通过双向开关直接在输入和输出之间进行能量传递。这种结构使得矩阵变换器具有更高的效率、更小的体积和更好的动态响应。在本项目中,我们将使用 MATLAB/Simulink 来建模和仿真一个矩阵变换器,并分析其性能。Simulink 是一个强大的仿真工具,特别适合用于电力电子系统的建模和仿真。

MHD0815的博客 1066

hbase 源代码分析 (15)compact 过程

这个流程还没有写完,只是作为自己的备忘,可以不用点击进来

chenfenggang的专栏 487

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HBase之Region Compact流程分析

Compact(合并):是指在HBase中,HRegion上某一个列簇部分或者全部Store File合并。是由于数据不断的被写入,MemStore达到阀值则会把数据flush到Store File持久化。这样样的话就有很多文件,越积越多会严重影响HBase的读取效率,所以HBase在满足一定条件获或者手动触发合并操作,讲很多文件合并成一个大文件   StoreEngine: 是一个能够为HS

happy19870612's blog 1287

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HBase-Compact-PressureAwareCompactionThroughputController分析

请求链路 配置 RegionServer启动的时候,初始化加载配置 参数 含义 下文简称 hbase.regionserver.throughput.controller 对应的策略类 目前只有两种,一种限流,一种不限流 hbase.hstore.compaction.th...

鲸鱼写程序的专栏 1351

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HBase源码分析之HRegion上compact流程分析(一)

首先来想两个问题:1、何谓compact?2、它产生的背景是怎样的? compact是指HBase表中HRegion上某个Column Family下,部分或全部HFiles的合并。它是由于数据在持续写入后,MemStore达到一定阈值,被flush到磁盘上,形成许许多多的文件,这些文件如果不做处理,将会严重影响HBase数据读取的效率。所以,在HBase系统内部,需要定期在满足一定条件的情况下,或者由人为手动触发,将这许多文件合并成一个大文件。 那么,在HRegion上,c

辰辰爸的博客 3293

hbase源码分析-compact

public List compact(CompactionContext compaction, CompactionThroughputController throughputController) throws IOException { assert compaction != null;//检查compact上下文是否为空 List sfs = null; CompactionRequ

qq234568970的博客 638

Hbase的Region Compact算法实现分析

Hbase的Region Compact算法属于一种多路归并的外排算法。这种算法的特点是,待排序文件本身是有序的,同时打开这些文件,顺序遍历并对比它们的首条数据,最后合并输出为一个文件,多个文件遍历时的首条数据用内存堆进行内排。  Hbase在实现该算法的过程中重要的是下面这五个类。  1.org.apache.hadoop.hbase.regionserver.Store  2.org

luyee2010的专栏 1733
上一篇: 服务器性能监控工具软件Nmon和ServerAgent对比
下一篇: hbase-site.xml配置
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值