一直以来有个疑问,HBase究竟是面向列(Column oriented)还是面向行(Row oriented)的存储?
其实按照 Martin Kleppmann 在他的名著 DDIA 里面的说法,HBase 的数据模型本质上还是行式存储。
Cassandra and HBase have a concept of column families, which they inherited from Bigtable. However, it is very misleading to call them column-oriented: within each column family, they store all columns from a row together, along with a row key, and they do not use column compression. Thus, the Bigtable model is still mostly row-oriented.
HBase 是基于 Bigtable 模型的,它是列族的概念,而每个列族包含了很多列。每个列族里的所有列仍然和 row key 以一行的形式存储在一起,因此从这个角度来看,在一个列族里,HBase 仍然是面向行的存储,而每个列族可以类比为关系型数据库的一张表。底层的文件存储是 LSM Tree 的结构,新的数据以 Key-Value 的形式被批量写到文件(SSTable)中,再进行合并压缩。这与通常的基于 B-tree 的关系型数据库的存储有很大区别。