基于列或基于行的HBase

时间:2012-08-05 12:55:33

标签: hbase

我想知道HBase是使用基于列的存储还是基于行的存储?

  • 我阅读了一些技术文档,并提到HBase的优点是使用基于列的存储将类似的数据存储在一起以促进压缩。因此,它意味着不同行的相同列存储在一起;
  • 但我也了解到HBase是一个有序的键值映射。它使用键来解决该键(行)的所有相关列,因此它似乎是基于行的存储?

如果有人能澄清我的困惑,我们将不胜感激。

提前谢谢, 乔治

2 个答案:

答案 0 :(得分:21)

George,这是我在HBaseCon 2012上了解HBase架构的演示文稿:

http://www.cloudera.com/content/cloudera/en/resources/library/hbasecon/video-hbasecon-2012-hbasecon-2012.html

简而言之,HBase中的每一行实际上都是一个键/值映射,您可以在其中拥有任意数量的列(键),每个列都有一个值。 (并且,从技术上讲,每个都可以有多个具有不同时间戳的值)。

此外,“列族”允许您在同一行中,在不同的物理(磁盘上)文件中托管多个键/值映射。这有助于在您拥有通常与其他集不相交的值集合的情况下进行优化(因此您可以减少从磁盘读取的内容)。当然,权衡是,如果将列分成两个列系列,那么读取行中的所有值的更多工作,因为所需的磁盘访问次数是2倍。

与更标准的“面向列的”数据库不同,我从来没有听说有人为每个逻辑列创建一个具有列族的HBase表。与列族相关的开销,一般建议通常不超过3或4。列族是“设计时”信息,这意味着您必须在创建(或更改)表时指定它们。

通常,我发现列族是一种高级设计选项,只有在您对HBase的体系结构有深入的了解后才能使用它,并且可以证明它是一种净效益。

总的来说,虽然HBase可以采用“面向列”的方式,但它不是HBase中的默认设置模式,也不是最常见的设计模式。最好将其视为具有键/值映射的行存储。

答案 1 :(得分:2)

除了Ian的优秀答案之外,我会认为HBase 都是基于行的键值,以及基于列的键值存储(如果您知道行 - 键)。

如果您更愿意从数据结构的角度考虑它,这就是简单的HBase表的样子:

'rowkey1' => {
    'c:col1' => 'value1',
    'c:col2' => 'value2',
},
'rowkey2' => {
    'c:col1' => 'value10',
    'c:col3' => 'value3'
}

当然,您也可以在其中存储更复杂的数据结构,正如您可以从Ian的演示中看到的那样。