【问题标题】:column based or row based for HBaseHBase 基于列或基于行
【发布时间】:2012-08-02 17:38:34
【问题描述】:

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

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

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

提前致谢, 乔治

【问题讨论】:

    标签: hbase


    【解决方案1】:

    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 中的默认设计模式,也不是最常见的设计模式。最好将其视为具有键/值映射的行存储。

    【讨论】:

    • 谢谢伊恩。演示文稿非常好!还有两个cmets,1.实际上我对基于列的存储的困惑来自“HBase The Definitive Guide”一书,第1章,“大数据的黎明”部分,它绘制了一张图片,显示HBase存储所有不同行的同一列连续物理存储。有cmets吗? 2.我想确认我的理解是正确的——假设我只有一个10列的列族,物理存储是一行之后的行(包含所有相关列),除了存储所有行的第一列,然后存储第二列所有行等?
    • 还有一些cmets,好像说基于列的存储,有两个意思,(1)面向列的数据库=>en.wikipedia.org/wiki/Column-oriented_DBMS,这里不同行的同一列存储在一起,(2 ) 和面向列的架构,例如Hbase是如何设计的,用于描述存储稀疏、大量列的模式(NULL免费)。有cmets吗?
    【解决方案2】:

    除了 Ian 的出色回答之外,我认为 HBase 是一个基于行的键值,以及一个基于列的键值存储(如果您知道行-键)。

    如果您更愿意从数据结构的角度来考虑它,那么简单的 HBase 表可能如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2017-10-06
      相关资源
      最近更新 更多