我是学生学习Google BigTable设计。
我很困惑,SST表在内部排序。可能无法对两个SST表进行排序。在这种情况下,似乎BigTable不支持主键的有效范围扫描?例如,“select * where id介于100和200之间”。 BigTable可能需要扫描所有SST才能获得结果。
然后我理解为什么SST被排序是因为对于单个主键查询,我们可以在SST中进行二进制搜索。
我的另一个问题是,MemTable是否排序?如果有,怎么样?因为MemTable需要经常更新。如果使用树之类的数据结构,那么当我们将MemTable写入SST时我们需要遍历树吗?
答案 0 :(得分:2)
听起来你至少已经对原始Bigtable论文进行了概述,但是如果你还没有阅读整篇论文,那么这里有一个参考。您的问题通常可以通过仔细阅读来解答:https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf
你对Bigtable的直觉很明显。磁盘上的SStables和Memtable都是根据主键进行排序的,任何读取(不仅仅是扫描)都需要咨询所有这些内容以生成合并视图。但是,请注意它们都在相同的键上排序,因此这相当于并行遍历。我们寻求在每个sstable和memtable中读取范围的开头,并从那里并行遍历它们。
第5.3节中提到了这个过程:"在SSTables序列和memtable的合并视图上执行有效的读操作。由于SSTables和memtable是按字典顺序排序的数据结构,因此可以有效地形成合并视图。"
使用布隆过滤器可以减轻这些查找中的一些,如本文第6部分所述,但不是全部。
当然,如果平板电脑中的sstables太多,这仍然会变得效率低下。本文的第5.4节详细介绍了如何解决这个问题,即定期合并"堆栈" sstables用于平板电脑的数量较少的新sstables。如果特定平板电脑停止接收写入,则最终会将其状态停顿为单个文件。
关于记忆的效率,本文没有规定特定的数据结构。但是,足以说有许多有效的内存中排序数据结构的例子。此外,第5.4节提到在给定的平板电脑中实际上可以存在多个memtable。当我们扫描一个memtable将其写入磁盘时,我们已经在平板电脑的顶部安装了一个新的memtable" stack"并从那里提供最新的来读。