6

HBase 如何执行查找和检索记录?例如,RDBMS 的 B 树在 HBase 中的等价物是什么?

[编辑]

我了解 HBase 如何解析 -ROOT- 和 .META。表以找出哪个区域保存数据。但是本地查找是如何执行的呢?

为了更好地说明,这里有一个例子:

  1. 我正在使用键 77 开始搜索(获取或扫描)记录。
  2. HBase 客户端认为密钥包含在由 RegionServer X 持有的 50-100 区域中。
  3. HBase 客户端联系 RegionServer X 以获取数据。

RegionServer X 如何找到记录 77 的位置?

RegionServer 是否使用某种查找表(例如 RDBMS 的 B 树?)作为区域的键?或者它是否需要读取 StoreFiles 的所有内容,从 50 到 77 的记录?

4

1 回答 1

6

TL;DR:它看起来像 HBase(像 BigTable),用作类似于 B+ 树的结构来进行查找。所以行键是主索引(默认情况下是 HBase 中任何排序的唯一索引。)

长答案:从这篇关于 HBase 写入路径的 Cloudera 博客文章中,看起来 HBase 的操作方式如下:

每个 HBase 表都由一组服务器托管和管理,这些服务器分为三类:

  • 一台活动的主服务器
  • 一台或多台备份主服务器
  • 许多区域服务器

区域服务器有助于处理 HBase 表。因为 HBase 表可能很大,所以它们被分成称为区域的分区。每个区域服务器处理一个或多个这些区域。

下一段有更多细节:

由于行键是排序的,因此很容易确定哪个区域服务器管理哪个键。...每个行键属于由区域服务器提供服务的特定区域。因此,基于 put 或 delete 的键,HBase 客户端可以找到合适的区域服务器。首先,它从 ZooKeeper quorum 中找到托管 -ROOT- 区域的区域服务器的地址。客户端从根区域服务器中找出托管 -META- 区域的区域服务器的位置。从元区域服务器中,我们最终找到为请求区域提供服务的实际区域服务器。这是一个三步过程,因此缓存区域位置以避免这一系列昂贵的操作。

另一篇 Cloudera 博客文章来看,用于将 HBase 保存在文件系统上的确切格式似乎在不断变化,但上述行键查找机制应该或多或少是一致的。

这种机制非常非常类似于Google BigTable 的查找(您将在 PDF 的第 4 页末尾开始的第 5.1 节中找到详细信息),它使用三级层次结构来查询行键位置:Chubby ->根平板电脑 -> METADATA 平板电脑 -> 实际平板电脑

更新:回答关于区域服务器内部查找的问题:我不确定,但由于行键是排序的,并且 HBase 知道开始键和结束键,我怀疑它使用二进制搜索插值搜索,两者都非常快 - 分别是 log(n) 和 log(log(n))。我认为 HBase 不需要扫描从起始行键到需要查找的行,因为对排序键的搜索是众所周知的问题,它有几个有效的解决方案。

于 2012-10-18T19:24:49.817 回答