一.什么是HBase Compaction
Hbase将Region中的Store中的一些HFile进行合并。
二.HBase合并原因:
HBase不停的刷写,导致存储目录中有过多的数据文件,文件太多会导致维护困难、降低数据查询性能和效率。对一堆的文件进行I/O操作,耗时太多。所以HBase定期会对这些琐碎的文件进行整理,即合并Compaction。
三.HBase合并原理:
分为三步:排序文件、合并文件、代替原文件服务。
HBase首先从待合并的文件中读出HFile中的key-value
,再按照由小到大的顺序写入一个新文件(storeFile
)中。这个新文件将代替所有之前的文件,对外提供服务。
四.HBase合并分类
1.Minor Compaction(小合并)
小合并是指将相邻的StoreFile
合并为更大的StoreFile
。
2.Major Compaction(大合并)
大合并是将多个StoreFile
合并为一个StoreFile
。
五.HBase合并时,清空以下三种数据
1.标记为删除的数据。
当我们删除数据时,HBase并没有把这些数据立即删除,而是将这些数据打了一个个标记,称为“墓碑”标记
。在HBase合并时,会将这些带有墓碑标记的数据删除。
2.TTL过期数据
TTL(time to live)
指数据包在网络中的时间。如果列族中设置了TTL
过期时间,则在合并的过程中,发现过期的数据将被删除。
3.版本合并
若版本号超过了列族中预先设定的版本号,则将最早的一条数据删除。
如:列族设置版本号是5,当此列族第六次保存数据时,会将最早一次数据删除。
六.合并的触发时机
1.MEMStore Flush
内存中的数据flush刷写到硬盘上以后,会对当前Store
中的文件进行判断,当数量达到阈值,则会触发Compaction。Compaction是以Store
为单位进行合并的。当Flush
刷写完成后,整个Region
的所有Store
都会执行Flush
。
2.后台线程周期性的检查
Compaction Checker
线程定期检查是否触发Compaction,Checker会优先检查文件数量是否大于阈值,再判断是否满足major Compaction的条件的时间范围内,如果满足,则触发一次大合并Major Compaction。
大合并条件:[7-7*0.5,7+7*0.5](单位:天)
在Hbase配置文件中,通过下面的参数,可以调整大合并的条件
参数 | 值 |
---|---|
hbase.hregion.majorcompaction | 7(天) |
hbase.hregion.majorcompaction.jitter | 0.5(天) |
3.手动触发
- 由于很多业务担心
MajorCompaction
影响读写性能,所以选择在低峰期手动触发合并。 - 当用户修改表结构后,希望立刻生效,则手动触发合并。
- 运维人员发现硬盘空间不够,则会手动触发合并,因为删除了过期数据,腾出空间。
大合并优化,提高性能
MajorCompaction
持续时间比较长,整个过程将消耗大量的系统资源,对上传业务有比较大的影响,所以线上业务通过将自动触发MajorCompaction
改为业务低峰期的手动触发,来优化Hbase系统。
总结:
本文介绍了HBase的合并原因、合并原理、合并分类、何时触发合并,以及对大合并的性能优化等内容,这也是HBase不同于其他关系型数据库的一种新特性,也是HBase能存储大量数据的写入不会慢,而且随着数据量的增加,HBase读取速度也不会越来越慢的原因。希望本文能加深你对HBase合并的理解。通过这几篇文章对HBase的介绍后,后续的文章中将详细讲解HBase的完成存储流程。喜欢本文请点赞和收藏。