HBase源码之Compaction的执行策略分析

HBase的Compaction操作一般都是表粒度的,该操作会将合并HStore下的storefile文件,具体应该合并哪些storefile文件则是由compaction的筛选算法决定的。

解析compact源码时可以看到待合并的文件集合是包装在CompactContext中,compact请求会包装成requestCompact,经层层调用后,在CompactSplitThread的requestCompactionInternal中完成compactContext的构造并提交线程池去执行。

从requestCompactionInternal中开始跟读代码,可以看到CompactionContext的构造以HStore为粒度,在HStore的requestCompaction中完成,把与compact文件筛选相关的逻辑列出如下:

public CompactionContext requestCompaction(int priority, CompactionRequest baseRequest) 
	throws IOException {

	CompactionContext compacion = storeEngine.createCompaction();
	CompactionRequest request = null;
	this.lock.readLock().lock();
	try {
		synchronized (filesCompacting) {
			//处理coprocessor;

			if (!compaction.hasSelection()) {
				try {
					compaction.select(this.filesCompacting, isUserCompaction, mayUseOffPeak
						forceMajor && filesCompacting.isEmpty());
				} catch (IOException e) {
					.......
				}
			}

			request = compaction.getRequest();
			final Collection<StoreFile> selectedFiles = request.getFiles();
			if (selectedFiles.isEmpty()) {
				return null;
			}
			addToCompactingFiles(selectedFiles);
		} finally {
			this.lock.readLock().unlock();
		}
	}

	return compaction;
}
有两种storeEngine的实现,分别是DefaultStoreEngine和StripeStoreEngine,对应的就有两种不同的compact筛选方式,分别为RatioBasedCompactionPolicy和StripeCompactionPolicy。hbase中使用的默认方法是RatioBasedCompactionPolicy。

介绍这两个算法前,首先说明每个storefile文件中都定义了一个sequence id,用于标识该文件的“新旧”,越新创建出来的storefile,其sequence id值越大,反之亦然。

所谓的compaction筛选算法可以建模为以下的一个问题:


图中的每个数字表示了文件的sequence id,数字越大,则文件越新,很有可能刚刚flush而成,意味着文件size也可能越小。这样的文件是compact时优先选择,因此store下的storefile文件会依据sequence从小到大排序,依次标记为f[0]、f[1]。。。。f[n-1],筛选策略就是要确定一个连续范围[start, end]内的storefile

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase是一个分布式非关系型数据库,它是以Hadoop作为底层的分布式存储系统。HBase的数据存储是基于列族的,数据的查询和访问是基于行键的,因此它具有快速的随机读写能力。下面是HBase的实验结果及分析: 1. 实验环境 HBase版本:2.0.0 Hadoop版本:2.7.3 操作系统:CentOS 7.2 硬件配置:16核CPU,64GB内存,4T硬盘 2. 实验过程 2.1 数据生成 使用Python脚本生成100万条数据,每条数据包括三个字段:rowkey、family和qualifier。其中,rowkey是唯一标识符,family和qualifier是列族和列的名称。 2.2 数据导入 将生成的数据导入到HBase中,使用Java API进行数据的插入操作。 2.3 数据查询 使用Java API对HBase中的数据进行查询操作,查询出每个rowkey对应的family和qualifier。 3. 实验结果 实验结果如下: 数据生成时间:30秒 数据导入时间:1分钟 数据查询时间:12秒 4. 分析 从实验结果来看,HBase具有较快的数据插入和查询速度。这是因为HBase采用了列族存储的方式,可以将同一行中的列族存储在一起,降低了IO操作的频率,从而提高了数据的读写速度。此外,HBase还采用了分布式存储和计算的方式,可以将数据分散存储在多台机器上,从而实现了横向扩展,提高了系统的可扩展性和容错性。 总之,HBase是一个高效、可扩展的非关系型数据库,适用于存储海量数据和实时查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值