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 ...
下面,我们将深入探讨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的发展历程和技术演进。
本项目旨在深入剖析HBase分布式数据库的设计源码,特别是它如何基于Java以及其他多种编程语言实现其分布式特性和高效的存储检索能力。 项目中Java语言的主导地位毋庸置疑,作为HBase的主要开发语言,Java不仅为...
基于Java和多种语言的HBase分布式数据库设计源码项目是一个复杂的软件开发工程,它主要采用Java语言构建,同时整合了Ruby、Shell、Python、HTML、CSS、JavaScript、C++、PHP、C和C等多种编程语言。该项目的核心目的...
将Java与HBase结合,可以利用Java的丰富生态和成熟的开发工具,加速HBase应用的开发和部署。 从给定的文件信息来看,该项目为一款利用Java语言实现的HBase分布式数据库设计。它包含了多种类型的文件,这些文件类型...
从项目文件结构上看,hbase-mapreduce、hbase-assembly、hbase-logging和hbase-annotations等子目录暗示了HBase在MapReduce处理、程序集打包、日志记录和代码注释方面的设计考虑。这些子目录下文件的细节是理解HBase...
源码中对应的实现类是`org.apache.hadoop.hbase.regionserver.HRegionServer`和`org.apache.hadoop.hbase.master.HMaster`。 4. **Region划分**:HBase将表数据划分为多个Region,每个Region包含一个或多个Column ...
通过深入研究HBase的源码和编写测试用例,我们可以更好地理解和优化这个系统,从而在大数据应用中发挥出其最大潜力。无论你是数据工程师、开发人员还是系统管理员,掌握HBase都能为你的职业生涯增添亮点。
HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...
基于HydraQL的hbase-sdk设计源码迁移与维护更新项目,不仅仅是对传统HBase操作方式的一种简化,更是对大数据处理能力的一次技术革新。它不仅提高了开发效率,还可能引领HBase操作的未来发展趋势,为处理大规模数据集...
该项目的文件结构和内容表明它是一个对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源码编译包