关于MemStore的补充

在通过HStore.add向store中加入�一个kv时,首先把数据写入到memstore中。这一点没有什么说明;

publiclongadd(finalKeyValue
kv) {

lock.readLock().lock();

try{

returnthis.memstore.add(kv);

}finally{

lock.readLock().unlock();

}

}

以上代码中调用memstore.add方法,

longadd(finalKeyValue
kv) {

KeyValue toAdd =maybeCloneWithAllocator(kv);

returninternalAdd(toAdd);

}

在上面的调用中,首先是通过maybeCloneWithAllocator去申请kv的内存。

privateKeyValue maybeCloneWithAllocator(KeyValue
kv) {

检查MemStoreLAB是否存在,假设不存在,表示没有配置MemStoreLAB

此配置通过hbase.hregion.memstore.mslab.enabled完毕,默认值为true.

通过hbase.hregion.memstore.mslab.chunksize配置chunksize大小,默认值为2048*1024(2m),

个人觉得,这块须要依据业务上的KV大小,去配置此大小,不然会导致空间的浪费

通过hbase.hregion.memstore.mslab.max.allocation配置单个KV的最大分配大小,默觉得256*1024(256k),

假设单个KV的大小超过了指定的大小,直接在堆内存上生成。

MemStoreLAB(mslab)主要是为了解决memstoreflush的内存碎片问题,而导致的javagc。

hbase通过mslab每次向内存分配一个chunksize大小的块,全部的kv过来时,向此chunk中加入�,

chunk不够时再又一次申请一个新的chunk块。每次flush时,直接把占用的chunk块进行flush,

从而降低minorgc的发生频率。

if(allocator==
null){

returnkv;

}

intlen = kv.getLength();

检查kv是否超过了配置的单个大小,假设超过,不做处理,否则从一个chunk中得到一个allocation或者新生成一个chunk

Allocation alloc =allocator.allocateBytes(len);

if(alloc ==
null){

//The allocation was too large, allocator decided

//not to do anything with it.

returnkv;

}

assertalloc.getData() !=
null;

System.arraycopy(kv.getBuffer(),kv.getOffset(), alloc.getData(), alloc.getOffset(), len);

KeyValue newKv =
newKeyValue(alloc.getData(), alloc.getOffset(), len);

newKv.setMvccVersion(kv.getMvccVersion());

returnnewKv;

}

在memstore中通过internalAdd-->addToKVSet把一个kv加入�到memstore听kvset容器中,

此容器每一次的add操作都会进行排序操作,排序的比較器通过KeyValue.KVComparator来实现。

kvset是一个KeyValueSkipListSet的实例,此实例里面有一个ConcurrentSkipListMap的map容器。

每一次的add操作,都会把kv当成map的key与value一起插入。

hbase memstorelab的更多相关文章

  1. HBase笔记4(调优)

    Master/Region Server调优 JVM调优 默认的RegionServer内存是1G,而Memstore默认占40%,即400M,实在是太小了,可以通过HBASE_HEAPSIZE参数修 ...

  2. hbase源码系列(十三)缓存机制MemStore与Block Cache

    这一章讲hbase的缓存机制,这里面涉及的内容也是比较多,呵呵,我理解中的缓存是保存在内存中的特定的便于检索的数据结构就是缓存. 之前在讲put的时候,put是被添加到Store里面,这个Store是 ...

  3. Hbase 学习(五) 调优

    1.垃圾回收器调优 当我们往hbase写入数据,它首先写入memstore当中,当menstore的值大于hbase.hregion.memstore.flush.size参数中设置的值后,就会写入硬 ...

  4. Hbase Region Server整体架构

    Region Server的整体架构 本文主要介绍Region的整体架构,后续再慢慢介绍region的各部分具体实现和源码 RegionServer逻辑架构图 RegionServer职责 1.    ...

  5. 13 hbase源码系列(十三)缓存机制MemStore与Block Cache

    这一章讲hbase的缓存机制,这里面涉及的内容也是比较多,呵呵,我理解中的缓存是保存在内存中的特定的便于检索的数据结构就是缓存. 之前在讲put的时候,put是被添加到Store里面,这个Store是 ...

  6. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  7. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  8. Hbase的伪分布式安装

    Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...

  9. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

随机推荐

  1. 第一篇:NSTread线程的创建

    #import "ViewController.h" //导入头文件 #import <pthread.h> @interfaceViewController () @ ...

  2. U3D学习笔记

    1.向量的点乘.叉乘以及归一化的意义 1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影 2)叉乘得到的向量垂直于原来的两个向量 3)标准化向量:用在只关系方向,不关心大小的时候 用 ...

  3. BZOJ 3713: [PA2014]Iloczyn( 枚举 )

    斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...

  4. win7 php 配置多个网站

    1.在C:\WINDOWS\system32\drivers\etc目录下,打开Hosts 添加A站和B站的DNS映射,如127.0.0.1 local.zhengxin.com127.0.0.1 l ...

  5. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  6. CodeForces 385C Bear and Prime Numbers 素数打表

    第一眼看这道题目的时候觉得可能会很难也看不太懂,但是看了给出的Hint之后思路就十分清晰了 Consider the first sample. Overall, the first sample h ...

  7. oracle数据库连接无响应的解决

    昨天中午时,查询到服务器的数据流水最晚记录是早上8点的,现场查看服务日志很奇怪,日志输出显示挂死在数据库连接这一步.多次调试无果,随后百度发现有资料显示oracle 10.2.1的版本有登录无响应的B ...

  8. 基于visual Studio2013解决算法导论之022队列实现(基于链表)

     题目 基于链表的队列实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  9. im 编辑命令总结

    一. VIM高亮 进入vim后,在普通模式下输入如下命令,开启php代码高亮显示   :syntax enable   :source $VIMRUNTIME/syntax/php.vim   二. ...

  10. Android基础【1】杀死进程(强行停止)应用程序的方法

    写在前面: 进入手机ODM已经很久,经历过几个项目项目下来,对高通.展讯.Marvell平台都进行了接触,对于我个人来说,参与手机系统项目的开发与维护,最明显的好处是可以深入的了解某一功能的具体实现过 ...