`

HBase MSLAB和MemStoreChunkPool源码

阅读更多

  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;
  }

 

 

1
1
分享到:
评论

相关推荐

    hbase权威指南源码

    《HBase权威指南》是一本深入探讨分布式大数据存储系统HBase的专业书籍,其源码提供了对书中各个章节涉及技术的直观展示和实践操作。源码分析可以帮助读者更好地理解和应用书中的理论知识,以下是对这份源码包中可能...

    hbase权威指南 配套源码

    《HBase权威指南》是一本深入探讨分布式列式数据库HBase的专业书籍,其配套源码提供了书中所提及的示例代码和实践案例,方便读者更好地理解和应用HBase。以下将详细解析HBase的相关知识点。 HBase是建立在Apache ...

    HBase实战源码

    下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于Hadoop生态系统,采用Master-Slave结构,包括一个HMaster和多个RegionServer。HMaster负责元数据管理、 Region分配和故障...

    hbase-0.94.13 jar和源码

    总的来说,HBase 0.94.13的jar包和源码提供了全面了解和使用HBase的工具。通过分析源码,开发者可以深入理解分布式数据库的设计思想,而jar包则使开发者能够快速构建基于HBase的应用。不过需要注意的是,0.94.13已经...

    最近很火的大数据Hadoop之Hbase0.99.2最新版源码

    总结起来,HBase 0.99.2源码的研究涵盖了分布式系统设计、数据存储、并发控制、通信协议等多个方面,对于理解和优化大数据处理系统具有极高的价值。通过对这些源码的深入学习,开发者不仅能掌握HBase的工作原理,还...

    hbase_coprocessor_hbase_coprocessorjava_源码

    这个压缩包“hbase_coprocessor_hbase_coprocessorjava_源码”显然包含了用Java API实现的HBase Coprocessor的相关代码和工具类,这将帮助我们深入理解如何在HBase中使用Coprocessors。 首先,Coprocessor是HBase中...

    hbase-0.98.1源码包

    通过阅读源码,开发者可以更深入地理解HBase的工作原理,优化应用程序性能,解决遇到的问题,或者为HBase贡献新的功能和改进。此外,还可以对比不同版本的源码,了解HBase的发展历程和技术演进。

    基于Java和多种语言的HBase分布式数据库设计源码分析

    本项目旨在深入剖析HBase分布式数据库的设计源码,特别是它如何基于Java以及其他多种编程语言实现其分布式特性和高效的存储检索能力。 项目中Java语言的主导地位毋庸置疑,作为HBase的主要开发语言,Java不仅为...

    基于Java和多种语言的hbase分布式数据库设计源码

    基于Java和多种语言的HBase分布式数据库设计源码项目是一个复杂的软件开发工程,它主要采用Java语言构建,同时整合了Ruby、Shell、Python、HTML、CSS、JavaScript、C++、PHP、C和C等多种编程语言。该项目的核心目的...

    基于Java语言实现的HBase分布式数据库设计源码

    将Java与HBase结合,可以利用Java的丰富生态和成熟的开发工具,加速HBase应用的开发和部署。 从给定的文件信息来看,该项目为一款利用Java语言实现的HBase分布式数据库设计。它包含了多种类型的文件,这些文件类型...

    基于Java语言的HBase分布式数据库设计源码分析

    从项目文件结构上看,hbase-mapreduce、hbase-assembly、hbase-logging和hbase-annotations等子目录暗示了HBase在MapReduce处理、程序集打包、日志记录和代码注释方面的设计考虑。这些子目录下文件的细节是理解HBase...

    Hbase1.3.1源码

    源码中对应的实现类是`org.apache.hadoop.hbase.regionserver.HRegionServer`和`org.apache.hadoop.hbase.master.HMaster`。 4. **Region划分**:HBase将表数据划分为多个Region,每个Region包含一个或多个Column ...

    hbase源码包和测试用例

    通过深入研究HBase的源码和编写测试用例,我们可以更好地理解和优化这个系统,从而在大数据应用中发挥出其最大潜力。无论你是数据工程师、开发人员还是系统管理员,掌握HBase都能为你的职业生涯增添亮点。

    HBase源码(hbase-2.4.9-src.tar.gz)

    HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...

    基于HydraQL的hbase-sdk设计源码迁移与维护更新

    基于HydraQL的hbase-sdk设计源码迁移与维护更新项目,不仅仅是对传统HBase操作方式的一种简化,更是对大数据处理能力的一次技术革新。它不仅提高了开发效率,还可能引领HBase操作的未来发展趋势,为处理大规模数据集...

    基于Java实现的Apache HBase分布式数据库设计源码分析

    该项目的文件结构和内容表明它是一个对HBase内部结构和工作机制进行了深入分析的源码优化项目。该项目不仅能够帮助开发者更好地理解HBase的内部工作原理,而且可以为分布式数据库的研究和应用提供重要的参考,尤其在...

    HBase源码分析

    HBase源码分析揭示了HBase在RPC通信机制方面的一些关键技术点,这包括了角色分配、通信信道建立、通信接口协议定义、对象序列化、传输控制和会话管理,以及在传输过程中可能出现的错误处理和重试机制。 HBase中的...

    kettle5.3连接hdfs、hbase、kettle5.2源码编译

    在本文档中,我们将深入探讨如何使用 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源码编译包

    hbase2.3.5+spark-3.0.3源码编译包

Global site tag (gtag.js) - Google Analytics