zoukankan      html  css  js  c++  java
  • hbase memstorelab

    关于MemStore的补充

    在通过HStore.addstore中加入�一个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加入�到memstorekvset容器中,

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

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

    每一次的add操作,都会把kv当成mapkeyvalue一起插入。


  • 相关阅读:
    一些文件的扩展名
    关于git,从svn转到git
    trousers--------dpkg: 处理软件包 trousers (--configure)时报错
    Ubuntu下运行DrClient以上网
    Ubuntu下的终端命令--复制文件从一个文件夹到另一个文件夹下
    VSCode放大字体的快捷键
    opessl版本过低造成的函数使用错误
    python的基本语法
    ubuntu和windows的解码方式
    ubuntu下强制删除文件夹
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3938960.html
Copyright © 2011-2022 走看看