HBase-压缩和分割原理

2024-09-03 16:32
文章标签 分割 原理 压缩 hbase

本文主要是介绍HBase-压缩和分割原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

HRegionServer调用合并请求

主要逻辑如下:

//遍历每个Store然后计算需要合并的文件,生成
//CompactionRequest对象并提交到线程池中执行
//根据throttleCompaction()函数规则来判断是提交到
//largeCompactions线程池还是smallCompactions线程池
CompactSplitThread#requestCompaction() {for (Store s : r.getStores().values()) {CompactionRequest cr = Store.requestCompaction(priority, request);ThreadPoolExecutor pool = s.throttleCompaction(cr.getSize())? largeCompactions : smallCompactions;pool.execute(cr);		ret.add(cr);}	
}//如果CompactionRequest的总大小 >
//minFilesToCompact * 2 * memstoreFlushSize
//则这次任务为major合并,否则在为minor合并
Store#throttleCompaction() {long throttlePoint = conf.getLong("hbase.regionserver.thread.compaction.throttle",2 * this.minFilesToCompact * this.region.memstoreFlushSize);return compactionSize > throttlePoint;		
}Store#compactSelection() {//选择出已经过期的StoreFileif(storefile.maxTimeStamp + store.ttl < now_timestamp) {//返回已经过期的store file文件集合	}//从0开始遍历到最后,如果发现有文件 > maxCompactSize则pos++//然后过滤掉这些大于maxCompactSize的文件while (pos < compactSelection.getFilesToCompact().size() &&compactSelection.getFilesToCompact().get(pos).getReader().length()> while (pos < compactSelection.getFilesToCompact().size() &&compactSelection.getFilesToCompact().get(pos).getReader().length()> maxCompactSize &&!compactSelection.getFilesToCompact().get(pos).isReference()) ++pos;if (pos != 0) compactSelection.clearSubList(0, pos); &&!compactSelection.getFilesToCompact().get(pos).isReference()) {++pos;}if (pos != 0) {      	compactSelection.clearSubList(0, pos);}      if (compactSelection.getFilesToCompact().size() < minFilesToCompact) {return;	}//计算出sumSize数组,数组大小就是Store中的文件数量//sumSize数组中每个元素的大小是根据StroeFile的大小再加上 sumSize[i+1](或者0)//然后减去fileSizes[tooFar](或者0)//sumSize的内容跟元素的fileSizes数组应该差别不大int countOfFiles = compactSelection.getFilesToCompact().size();long [] fileSizes = new long[countOfFiles];long [] sumSize = new long[countOfFiles];for (int i = countOfFiles-1; i >= 0; --i) {StoreFile file = compactSelection.getFilesToCompact().get(i);fileSizes[i] = file.getReader().length();// calculate the sum of fileSizes[i,i+maxFilesToCompact-1) for algoint tooFar = i + this.maxFilesToCompact - 1;sumSize[i] = fileSizes[i] + ((i+1    < countOfFiles) ? sumSize[i+1]      : 0)- ((tooFar < countOfFiles) ? fileSizes[tooFar] : 0);}//如果fileSize[start] > Math.max(minCompactSize,sumSize[start+1] * r)//则下标++,这里的操作是过滤掉过大的文件,以免影响合并时间while(countOfFiles - start >= this.minFilesToCompact && fileSizes[start] >Math.max(minCompactSize, (long)(sumSize[start+1] * r))) {++start;}int end = Math.min(countOfFiles, start + this.maxFilesToCompact);long totalSize = fileSizes[start] + ((start+1 < countOfFiles) ? sumSize[start+1] : 0);compactSelection = compactSelection.getSubList(start, end);//如果是major compact,并且需要执行的文件数量过多,则去掉一些	if(majorcompaction && compactSelection.getFilesToCompact().size() > this.maxFilesToCompact) {int pastMax = compactSelection.getFilesToCompact().size() - this.maxFilesToCompact;compactSelection.getFilesToCompact().subList(0, pastMax).clear();		}		
}

 

 

 

 

 

CompactionRequest线程(用于执行major和minor合并)

压缩相关的类图如下:



major和minor合并的差别其实很小,如果最后待合并的总大小 > 2*minFilesToCompact*memstoreFlushSize

则认为这次是一个major合并,方到major线程池中执行,否则认为是一次minor合并

另外在创建StoreScanner构造函数时,会根据ScanType来判断是major还是minor合并,之后在

ScanQueryMathcer中根据ScanType的不同(有用户类型,minor和major三种类型)来决定返回的不同值的

主要逻辑如下:

//在单独的线程中执行合并
CompactionRequest#run() {boolean completed = HRegion.compact(this);if (completed) {if (s.getCompactPriority() <= 0) {server.getCompactSplitThread().requestCompaction(r, s, "Recursive enqueue", null);} else {// see if the compaction has caused us to exceed max region sizeserver.getCompactSplitThread().requestSplit(r);}		}
}//这里会调用Store,来执行compact
HRegion#compact() {Preconditions.checkArgument(cr.getHRegion().equals(this));lock.readLock().lock();C

这篇关于HBase-压缩和分割原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133456

相关文章

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建