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

相关文章

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方式创建

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c