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),