hbase 之 bloomfilter

bloomfilter  原理是什么大家可以网上查找详细资料挺多

主要配置参数:

io.storefile.bloom.error.rate  容错率

io.storefile.bloom.max.fold    最大折叠因子 (看下面计算过程解释)


bloomfilter  初始化在构造  StoreFille.Wtite的时候

  generalBloomFilterWriter = BloomFilterFactory.createGeneralBloomAtWrite(
          conf, cacheConf, bloomType,
          (int) Math.min(maxKeys, Integer.MAX_VALUE), writer);


如果大于v1 版本则使用 CompoundBloomFilterWriter  

初始化为

    chunkByteSize = ByteBloomFilter.computeFoldableByteSize(chunkByteSizeHint * 8, maxFold);
    this.errorRate = errorRate;    容错率
    this.hashType = hashType;      hash类型 默认murmur
    this.maxFold = maxFold;        最大折叠因子
    this.cacheOnWrite = cacheOnWrite;  时候cacheonwrite
    this.comparator = comparator;     比较器如果rowcol为KeyComparator 否则 ByteArrayComparator

下面是chunkByteSize的大小计算过程

计算过程:

io.storefile.bloom.block.size  默认 128 * 1024  以下以128表示

1、128*8

2、(128+7)/8 没搞明白为什么其实和上面的值应该是一样的嘛

3、然后接下里的操作我的理解就是   128+2的n次方,这个n 就是factor 即  io.storefile.bloom.max.fold


将封装的CompoundBloomFilterWriter  放到 inlineBlockWriters  集合中, CompoundBloomFilterWriter  是实现inlineBlockWriters  接口的。


-------------------------------------------------------------------------------------------

下面是写入时应用:

put数据的时候 writer.apppend 会调用写bloomFilter, 即 appendGeneralBloomfilter(kv)接下来的都是先讨论Type为Row的情况。

接下来对Row值进行获取、调用CompoundBloomFilterWriter.add 方法,此方法主要工作为:

把值放到chunk中,但是如果chunk (ByteBloomFilter) 为空的话,同时说明是第一个key 即变量firstKeyInChunk 应该是为空的, 接下来将第一个kv 中的 Row 赋值给firstKeyInChunk ,接下来创建一个新的chunk ,新chunk 会创建一个chunkByteSize 大小的bloom (ByteBuffer),






你可能感兴趣的:(hbase 之 bloomfilter)