我想知道 HBase 是使用基于列的存储还是基于行的存储?
- 我阅读了一些技术文档并提到 HBase 的优点是使用基于列的存储将相似的数据存储在一起以促进压缩。所以这意味着不同行的相同列存储在一起;
- 但我也了解到 HBase 是一个排序的键值映射。它使用键来处理该键(行)的所有相关列,所以它似乎是基于行的存储?
如果有人能澄清我的困惑,我们将不胜感激。
提前谢谢,乔治
我想知道 HBase 是使用基于列的存储还是基于行的存储?
如果有人能澄清我的困惑,我们将不胜感激。
提前谢谢,乔治
George,这是我在 HBaseCon 2012 上关于理解 HBase 模式的演示文稿:
简而言之,HBase 中的每一行实际上是一个键/值映射,其中可以有任意数量的列(键),每个列都有一个值。(而且,从技术上讲,每个都可以有多个具有不同时间戳的值)。
此外,“列族”允许您在同一行、不同的物理(磁盘上)文件中托管多个键/值映射。这有助于在您的值集通常与其他集不相交地访问的情况下进行优化(因此您可以从磁盘读取的内容更少)。当然,权衡是,如果将列分成两个列族,则读取一行中的所有值需要更多的工作,因为所需的磁盘访问次数是 2 倍。
与更标准的“面向列”的数据库不同,我从未听说过有人创建了一个 HBase 表,其中每个逻辑列都有一个列族。有与列族相关的开销,一般建议通常不超过 3 或 4 个。列族是“设计时”信息,这意味着您必须在创建(或更改)表时指定它们。
一般来说,我发现列族是一种高级设计选项,只有在您深入了解 HBase 的架构并且可以证明它会带来净收益时,您才会使用它。
总的来说,虽然 HBase 确实可以以“面向列”的方式运行,但它不是 HBase 中的默认设计模式,也不是最常见的设计模式。最好将其视为具有键/值映射的行存储。
除了 Ian 的出色回答之外,我认为 HBase既是基于行的键值对,也是基于列的键值存储(如果您知道行键)。
如果您更喜欢从数据结构的角度来考虑它,那么简单的 HBase 表可能如下所示:
'rowkey1' => {
'c:col1' => 'value1',
'c:col2' => 'value2',
},
'rowkey2' => {
'c:col1' => 'value10',
'c:col3' => 'value3'
}
当然,您也可以在其中存储更复杂的数据结构,正如您从 Ian 的演示文稿中看到的那样。