`

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 ...

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

    本项目为基于Java语言的HBase分布式数据库设计源码,包含5415个文件,涵盖了4575个Java源文件、223个Ruby脚本、118个XML...该源码是GitHub上HBase项目的核心代码,适用于需要深入理解和分析HBase架构与实现细节的场景。

    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分布式数据库设计源码

    该项目是一款基于Java的HBase分布式数据库设计源码,融合了多种编程语言,包括Ruby、Shell、Python、HTML、CSS、JavaScript、C++、PHP、C和C。源码文件总数达到5259个,其中Java源文件占主导地位,高达4436个。该...

    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源码编译包

    Hbase权威指南 随书源代码 源码包 绝对完整版

    Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。

    HBase的Java客户端源码

    HBASE的java版本的客户端,运行代码需要设定环境变量且打包成jar文件运行

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

    该项目为HBase分布式数据库的设计源码,采用Java作为主要开发语言,并融合了Ruby、Shell、Python、HTML、JavaScript、CSS、C++、C、PHP等语言,总文件量达到5854个。其中,Java文件占主导地位,达4975个,其他文件...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

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

    该项目是对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-1.2.6-bin+src.tar.rar"中的源码和工具,我们可以更好地理解和掌握HBase的工作原理,提高大数据处理的能力。同时,持续关注社区更新和最佳实践,以适应不断发展的技术需求。

Global site tag (gtag.js) - Google Analytics