HBase基于列或基于行

HBase基于列或基于行,hbase,Hbase,我想知道HBase使用的是基于列的存储还是基于行的存储 我阅读了一些技术文档,并提到HBase的优点是使用基于列的存储将类似的数据存储在一起以促进压缩。这意味着不同行的相同列存储在一起 但我还了解到HBase是一个排序键值映射。它使用键来寻址该键(行)的所有相关列,所以它似乎是基于行的存储 如果有人能澄清我的困惑,我将不胜感激 提前感谢,, GeorgeGeorge,以下是我在2012年HBaseCon上介绍的关于理解HBase模式的内容: 简而言之,HBase中的每一行实际上都是一个键/

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

  • 我阅读了一些技术文档,并提到HBase的优点是使用基于列的存储将类似的数据存储在一起以促进压缩。这意味着不同行的相同列存储在一起
  • 但我还了解到HBase是一个排序键值映射。它使用键来寻址该键(行)的所有相关列,所以它似乎是基于行的存储
如果有人能澄清我的困惑,我将不胜感激

提前感谢,,
George

George,以下是我在2012年HBaseCon上介绍的关于理解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的演示中所看到的。

谢谢Ian。演讲很棒!还有两条评论,1。实际上,我对基于列的存储的困惑来自于《HBase最终指南》一书第1章“大数据的曙光”一节,该书描绘了一幅图,显示HBase在存储中连续存储所有不同行的同一列。有什么评论吗?2.我想确认我的理解是正确的——假设我只有一个包含10列的列族,物理存储是一行接一行(包含所有相关列),而不是存储所有行中的第一列,然后存储所有行中的第二列,等等?还有一些注释,当我们说基于列的存储时,似乎有两种含义,(1)面向列的数据库=>,其中不同行的相同列存储在一起,(2)和面向列的体系结构,例如Hbase是如何设计的,用于描述存储稀疏、大量列的模式(空为空)。有什么评论吗?