memstore作为hbase数据写入的核心部分,保障了数据的高效的写入,那其具体是怎么实现的?使用了哪些优化的手段?有哪些关键要素可以控制写入的效率呢?下面我们先来分析一下memstore的实现
memstore中的数据存储
DefaultMemStore.java
// 2个存储数据的集合
volatile CellSkipListSet cellSet;
volatile CellSkipListSet snapshot;
cellSet:写入的数据都会存储在cellSet中,snapshot是在memstore做flush时才用到的,这个我们后续再说
我们先来看往memstore中添加数据的情况
public Pair<Long, Cell> add(Cell cell) {
Cell toAdd = maybeCloneWithAllocator(cell);
return new Pair<Long, Cell>(internalAdd(toAdd), toAdd);
}
这里使用到了一个叫MSLAB的机制,这个是用来解决HBase因 Region flush导致的内存碎片问题