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操作流程以及对读写服务的影响”。
More Info:HBase深入分析之RegionServer
From Binospace, post 深入分析HBase Compaction机制
文章的脚注信息由WordPress的wp-posturl插件自动生成
相关推荐
将HBase作为研究对象,分析其存储架构,针对HBase存储机制进行深入研究
基于数据冗余的HBase合并机制研究_HBase列式数据库的所有操作均以追加数据的方式写入,导致其合并机制占用资源过多,影响系统读性能。
本文将深入探讨HBase的性能测试细节,重点剖析数据插入性能,并通过实证分析揭示其背后的机制与优化策略。 #### 数据插入性能测试设计 在评估HBase的实时数据插入性能时,测试场景设计至关重要。以随机值的Rowkey...
《深入学习HBase原理》...6. HBase与其他技术如Hadoop、Hive、NoSQL和MongoDB的集成,提供了丰富的数据管理和分析能力。 深入理解这些原理,对于优化HBase的性能、保证数据安全以及构建高效的大数据解决方案至关重要。
HBase In-Memory Compaction是HBase存储系统中的一种高性能的存储机制,它基于Log-Structured-Merge(LSM)树设计,通过将数据存储在内存中,减少磁盘I/O操作,提高写入吞吐量和读取延迟性能。 Accordion算法是...
《深入探讨HBase查询机制》 HBase,作为一款分布式列式存储系统,以其高效、可扩展的特性在大数据领域广泛应用。本文将深入探讨HBase的查询机制,以帮助我们理解其背后的运作原理。 首先,我们需要了解HBase的查询...
总结,`SEP`机制通过`hbase-indexer`组件实现了HBase与Elasticsearch之间的数据实时同步,让用户能够在保持HBase强大存储能力的同时,享受到Elasticsearch的搜索与分析优势。在实际部署和使用过程中,需根据业务需求...
HBase是Apache Software Foundation下的一个开源的非关系型分布式数据库(NoSQL)...通过深入分析HBase的源码,我们可以更好地理解其背后的设计思想和实现细节,这对于在实际工作中进行性能调优和问题诊断非常有帮助。
在全量导入过程中,HBase的compaction机制可能会显著减慢写入速度。这是因为compaction会合并多个小文件以减少磁盘I/O操作,但在大规模数据导入时,这一过程可能过于频繁,导致系统性能下降。为解决这一问题,可以...
本文将基于hbase-0.98.23的源代码,深入解析其内部机制,帮助读者理解HBase的运行原理和设计思想。 首先,HBase的核心设计理念是基于BigTable模型,它将数据存储为表,每个表由行和列族组成。行键是唯一的,而列族...
- **第3章:分布式HBase、HDFS和MapReduce**:深入探讨HBase如何与HDFS交互,以及如何利用MapReduce进行数据分析。此外,还会介绍HBase的分布式特性,包括数据分片、负载均衡和故障恢复机制。 - **第二部分:高级...
使用HBase的Compaction和Split机制,保持Region的平衡;并考虑使用二级索引提高查询效率。 六、总结 通过SpringBoot搭建的HBase可视化系统,使得非技术人员也能便捷地管理和操作HBase,降低了使用门槛,提高了工作...
在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...
在深入探讨HBase 1.0.3的Part2之前,我们先回顾一下HBase的基本概念。HBase,作为Apache Hadoop生态系统中的一个分布式列式数据库,提供实时读写、强一致性的存储服务。它基于Google的Bigtable设计,适用于海量数据...
2. 数据分析和挖掘:基于协处理器的HBase内存索引机制可以应用于数据分析和挖掘领域,提高数据处理和分析的效率和准确性。 3. 云计算和分布式系统:基于协处理器的HBase内存索引机制可以应用于云计算和分布式系统...
* Compaction 机制:Compaction 是 HBase 中的一种机制,用于合并小文件以提高读写性能。可以通过调整 Compaction 的阈值、频率和策略来优化性能。 * Flush 机制:Flush 是 HBase 中的一种机制,用于将内存中的数据...
在深入探讨HBase之前,我们首先要理解HBase的基础架构和工作原理。HBase是一个分布式、行式、基于列族的NoSQL数据库,它构建在Hadoop的HDFS之上,为大数据处理提供了高效、低延迟的数据存储和访问能力。 标题中的...
接下来,书中深入探讨了HBase的框架设计,包括Region Server的职责、Zookeeper的角色、Master节点的管理功能以及HDFS如何为HBase提供底层存储支持。理解这些组件的工作机制,对于优化系统性能、处理故障和保证服务高...
通过上述内容可以看出,《HBase权威指南》全面而深入地介绍了HBase的相关知识和技术要点,无论是对于初次接触HBase的新手还是想要深入了解其内部机制的资深开发者来说,都是一本不可多得的好书。该书不仅详细解释了...