MSLAB工作原理,举个例子HStore在add的时候的例子,其他操作也差不多,很简单
MSLAB是解決menstorm的內存碎片, MemStoreChunkPool是解決full gc頻繁,自己管理chunk数据,避免gc
MemStoreChunkPool使用的是memstorm的limit * chuckpoolpercent:是memstorm的百分比
hbase.regionserver.global.memstore.upperLimit * hbase.hregion.memstore.chunkpool.initialsize
MemStore
/** * Write an update * @param kv * @return approximate size of the passed key and value. */ long add(final KeyValue kv) { KeyValue toAdd = maybeCloneWithAllocator(kv);//mslab将kv放到大chunk下 return internalAdd(toAdd);//添加到memkvset中 } private KeyValue maybeCloneWithAllocator(KeyValue kv) { if (allocator == null) { return kv; } //使用mslsb,获得当前chunk或放不下返回一个空chunk int len = kv.getLength(); Allocation alloc = allocator.allocateBytes(len); if (alloc == null) { // The allocation was too large, allocator decided // not to do anything with it. return kv; } assert alloc.getData() != null; //将kv拷贝到chunk里 System.arraycopy(kv.getBuffer(), kv.getOffset(), alloc.getData(), alloc.getOffset(), len); KeyValue newKv = new KeyValue(alloc.getData(), alloc.getOffset(), len); newKv.setMvccVersion(kv.getMvccVersion()); return newKv; }
MemStoreLAB的方法allocateBytes,获得当前chunk或放不下返回一个空chunk
public Allocation allocateBytes(int size) { Preconditions.checkArgument(size >= 0, "negative size"); // Callers should satisfy large allocations directly from JVM since they // don't cause fragmentation as badly. if (size > maxAlloc) {//太大的kv(超过256K)不会造成内存碎片,所以不用mslab, return null; } while (true) { Chunk c = getOrMakeChunk();//获得当前chunk // Try to allocate from this chunk int allocOffset = c.alloc(size); if (allocOffset != -1) {//当前chunck可以容下 // We succeeded - this is the common case - small alloc // from a big buffer return new Allocation(c.data, allocOffset); } // not enough space! // try to retire this chunk tryRetireChunk(c);//当前chunck装不下kv,设置当前chunk为空,等待下次循环生成chunk } }
其中MemStoreChunkPool类
pool put方法
//在没有compareandset成功后,将刚取来的chunk放回pool中,
可能有bug,当pool中没有,会新建一个,但是没有初始化byte[],也就是chunk里的data为空,没申请资源,就放到pool里给别人用了
void putbackChunk(Chunk chunk) { if (reclaimedChunks.size() >= this.maxCount) { return; } reclaimedChunks.add(chunk); }
memstore在将snapshot flush之后,将涉及到的chunk放回pool中
/** * Add the chunks to the pool, when the pool achieves the max size, it will * skip the remaining chunks * @param chunks */ void putbackChunks(BlockingQueue<Chunk> chunks) { int maxNumToPutback = this.maxCount - reclaimedChunks.size(); if (maxNumToPutback <= 0) { return; } chunks.drainTo(reclaimedChunks, maxNumToPutback); }
pool get方法
/** * Poll a chunk from the pool, reset it if not null, else create a new chunk * to return * @return a chunk */ Chunk getChunk() { Chunk chunk = reclaimedChunks.poll(); if (chunk == null) { chunk = new Chunk(chunkSize); createdChunkCount.incrementAndGet(); } else { chunk.reset(); reusedChunkCount.incrementAndGet(); } return chunk; }
相关推荐
《HBase权威指南》是一本深入探讨分布式大数据存储系统HBase的专业书籍,其源码提供了对书中各个章节涉及技术的直观展示和实践操作。源码分析可以帮助读者更好地理解和应用书中的理论知识,以下是对这份源码包中可能...
《HBase权威指南》是一本深入探讨分布式列式数据库HBase的专业书籍,其配套源码提供了书中所提及的示例代码和实践案例,方便读者更好地理解和应用HBase。以下将详细解析HBase的相关知识点。 HBase是建立在Apache ...
本项目为基于Java语言的HBase分布式数据库设计源码,包含5415个文件,涵盖了4575个Java源文件、223个Ruby脚本、118个XML...该源码是GitHub上HBase项目的核心代码,适用于需要深入理解和分析HBase架构与实现细节的场景。
下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于Hadoop生态系统,采用Master-Slave结构,包括一个HMaster和多个RegionServer。HMaster负责元数据管理、 Region分配和故障...
总的来说,HBase 0.94.13的jar包和源码提供了全面了解和使用HBase的工具。通过分析源码,开发者可以深入理解分布式数据库的设计思想,而jar包则使开发者能够快速构建基于HBase的应用。不过需要注意的是,0.94.13已经...
总结起来,HBase 0.99.2源码的研究涵盖了分布式系统设计、数据存储、并发控制、通信协议等多个方面,对于理解和优化大数据处理系统具有极高的价值。通过对这些源码的深入学习,开发者不仅能掌握HBase的工作原理,还...
这个压缩包“hbase_coprocessor_hbase_coprocessorjava_源码”显然包含了用Java API实现的HBase Coprocessor的相关代码和工具类,这将帮助我们深入理解如何在HBase中使用Coprocessors。 首先,Coprocessor是HBase中...
通过阅读源码,开发者可以更深入地理解HBase的工作原理,优化应用程序性能,解决遇到的问题,或者为HBase贡献新的功能和改进。此外,还可以对比不同版本的源码,了解HBase的发展历程和技术演进。
该项目是一款基于Java的HBase分布式数据库设计源码,融合了多种编程语言,包括Ruby、Shell、Python、HTML、CSS、JavaScript、C++、PHP、C和C。源码文件总数达到5259个,其中Java源文件占主导地位,高达4436个。该...
通过深入研究HBase的源码和编写测试用例,我们可以更好地理解和优化这个系统,从而在大数据应用中发挥出其最大潜力。无论你是数据工程师、开发人员还是系统管理员,掌握HBase都能为你的职业生涯增添亮点。
HBase源码分析揭示了HBase在RPC通信机制方面的一些关键技术点,这包括了角色分配、通信信道建立、通信接口协议定义、对象序列化、传输控制和会话管理,以及在传输过程中可能出现的错误处理和重试机制。 HBase中的...
在本文档中,我们将深入探讨如何使用 Kettle 5.3 版本连接到 HDFS 和 HBase,以及如何对 Kettle 5.2 的源码进行编译。 一、Kettle 5.3 连接 Hadoop 2.2.0 连接 Hadoop 2.2.0 需要确保以下步骤已经完成: 1. 安装 ...
hbase2.3.5+spark-3.0.3源码编译包
Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。
HBASE的java版本的客户端,运行代码需要设定环境变量且打包成jar文件运行
该项目为HBase分布式数据库的设计源码,采用Java作为主要开发语言,并融合了Ruby、Shell、Python、HTML、JavaScript、CSS、C++、C、PHP等语言,总文件量达到5854个。其中,Java文件占主导地位,达4975个,其他文件...
在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...
该项目是对hbase-sdk进行源码迁移至HydraQL的设计,涉及812个文件,包括420个Ruby脚本、333个Java源文件、28个XML配置文件、8个Shell脚本、5个Grammar文件、5个属性文件、2个JAR包、2个Token文件、2个YAML文件以及1...
通过深入学习和实践"Hbase-1.2.6-bin+src.tar.rar"中的源码和工具,我们可以更好地理解和掌握HBase的工作原理,提高大数据处理的能力。同时,持续关注社区更新和最佳实践,以适应不断发展的技术需求。