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 不需要扫描从起始行键到需要查找的行,因为对排序键的搜索是众所周知的问题,它有几个有效的解决方案。