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

相关文章

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

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们