HBase杂谈

HBase常见问题备忘

scan扫描时最好增加限定条件

  1. 客户端设计scan时,scan尽量使用范围扫描加快查询速度,scan.setStopRow(key)时,stopRow不包括在扫描范围内。

scan时怎么使用BloomFilter

scan之前我们需要使用BF对StoreFile进行过滤,那仔细想下,到底用哪个rowkey过滤?实际实现中系统使用scan的startrow作为过滤条件进行过滤,这是不是有问题?举个简单的例子,假设小明检索的数据为[row1, row4],如果此文件不包含row1,而包含row2,这样在scan前你利用row1就把该文件淘汰掉了,row4这条数据怎么办?不是会被遗漏?

这里系统实现有个隐藏点,scan之前使用BF进行过滤只针对get查询以及scan单条数据的场景scan多条数据并不会执行实际的BF过滤,而是在实际seek到新一行的时候才会启用BF根据新一行rowkey对所有StoreFile过滤。

最小堆中弹出cell之后如何对该cell进行检查过滤,确保满足用户设置条件?检查过滤之后是继续弹出下一个cell,还是跳过部分cell重新seek到下一列或者下一行?

心代码主要参考ScanQueryMatcher.match(cell)方法。

堆顶元素kv检查之后会返回MatchCode,它会告诉scanner是继续seek下一个cell,还是直接跳过部分cell直接seek到下一列(对应INCLUDE_AND_SEEK_NEXT_COL或SEEK_NEXT_COL),抑或是直接seek到下一行(对应INCLUDE_AND_SEEK_NEXT_ROW或SEEK_NEXT_ROW)。下一列是指由于本身一个Cell会有多个版本号,略过部分版本号的cell,直接到下一个column。下一行就是该column后面的列不检索,直接到下一个rowKey

Share