引文:
列簇本质上是一颗LSM树。
LSM树分为内存部分和磁盘部分。
内存部分是一个维护有序数据集合的数据结构,可选择平衡二叉树、红黑树、跳跃表等。HBase选择了跳跃表,理由是并发性更好。
磁盘部分由独立的文件组成,文件由独立的数据块组成,为了减少IO耗时(磁盘寻道及数据读取),HBase使用了布隆过滤器来判断数据是否存储在数据块中。
跳跃表(SkipList):
高效实现插入、删除、查找的内存数据结构,复杂度为O(logN)。
与红黑树及其他的二分查找树相比,跳跃表的优势在于实现简单,并发场景下加锁粒度更小,从而可以实现更高的并发性。
被广泛用于KV数据库中,如Redis、LevelDB、HBase。
LSM树(Log-Structured Merge-Tree):
LSM树本质上和B+树一样是一种磁盘数据的索引结构,区别在于,LSM树的索引对写入更友好。
任何写入请求都会被LSM树处理为一次顺序写,而HDFS擅长于顺序写(不支持随机写)。
索引由内存和磁盘两部分构成。内存部分由跳跃表来维护,磁盘部分由有序的KV文件构成。
每个KV由一个字节数组表示,该数组详见p17。
Region中的MemStore就是一个跳跃表,当MemStore过大时会flush形成有序文件HFile,此时所有IO都是顺序IO,速度最快。都是一旦有读请求,则需要将这些HFile进行多路归并。
归并的方式有两种:minor compact和major compact,前者一次归并少数文件,后者一次性将所有文件归并成一个文件。
布隆过滤器(Bloom Filter):
用于高效判断元素是否存在于集合中。