在HBase的磁盘上,列族是一个挨着另一个放置的吗?换句话说,HBase柱是面向的吗



我试图理解HBase是否是一个面向列的DB。我了解一行HBase的结构-它被分为列族(静态且不变(,每个列族可以有动态列数:

row: row-key1, familyA:a1 familyA:a2... familyB:b1,familyB:b2,familyB:b3

现在它声明了一个列族一起存储在磁盘上。因此,row:row-key1的系列A:a1系列A:a2列将一起存储在磁盘上。

但是两个不同行中的familyA:a1 familyA:a2值呢?他们也一个接一个地储存吗?这意味着HBase是面向列的

无论我看哪里,我都会看到HBase是宽列存储,它和面向列的一样吗?

在回答这个问题之前,我想指出一件关于HBase用例的事情,这将使您更容易理解HFile布局。HBase(从读取工作负载的角度来看(针对非常长和宽的表(数万亿行和数百万列(中的随机键值查找进行了优化。它也适用于基于行键前缀的扫描,但它不是为大型单列扫描而构建的。

也就是说,HBase并不是一个真正的柱状数据库,尤其是当它被视为一个宽列存储时。HBase将同一行关键字和同一列族的所有列存储在一起。但是,不同的列族存储在不同的文件中,这为HBase提供了列性质,因为您可以独立控制每个列族的配置,并且可以扫描单个列族,而不必担心由于其他列族中的列而带来的读取成本。这就是单个HFile的样子(请注意,在HBase中,列被称为限定符类型也可以是PutDelete(:

RowKey1:Family1:Qualifier1:Timestamp1:Type:Value
RowKey1:Family1:Qualifier1:Timestamp2:Type:Value
RowKey1:Family1:Qualifier2:Timestamp0:Type:Value
RowKey1:Family1:Qualifier3:Timestamp2:Type:Value
RowKey2:Family1:Qualifier1:Timestamp0:Type:Value
RowKey2:Family1:Qualifier2:Timestamp2:Type:Value

请注意,Qualifier1对于RowKey1RowKey2不相邻。相反,同一行的所有列(即RowKey1键(都是相邻的。

如果您将每一列存储在其自己的列族中,HBase将成为一个真正的列存储,但由于其实现ACID的锁定策略提供了单行跨列的ACID信号,因此它将无法为数百万列提供支持。

编辑

考虑到HFile的上述结构,HFile数据实际上是以基于以下密钥的排序格式存储的(注意,一个文件只能有一个族,因此,将族名称存储在数据本身中有些多余,但在这个问题的范围之外还有其他用途(:

RowKey:Family:Qualifier:Timestamp:Type

这种排序顺序,再加上HFiles上的块级索引和bloom过滤器,使HBase能够快速定位任何随机的RowKey,或RowKey,Family:Qualifier元组,或RowKey,Family:Qualifier,Timestamptuple。

相关内容

最新更新