我想知道HBase是使用基于列的存储还是基于行的存储?
如果有人能澄清我的困惑,我们将不胜感激。
提前谢谢, 乔治答案 0 :(得分:21)
George,这是我在HBaseCon 2012上了解HBase架构的演示文稿:
简而言之,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的演示中看到的那样。