簡體   English   中英

在 HBase 的磁盤上,列族是一個挨着一個放置的嗎? 換句話說,HBase是面向列的嗎?

[英]is a column family placed one next to the other on disk in HBase? another words, is HBase Column-oriented?

我想了解 HBase 是否是面向列的數據庫。 我了解一行 HBase 的結構 - 它分為列族(static 並且不會改變)並且每個列族可以具有動態列數:

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

現在它指出列族一起存儲在磁盤上。 所以 row:row-key1 的 familyA:a1 familyA:a2 列將一起存儲在磁盤上。

但是兩個不同行中的 familyA:a1 familyA:a2 值呢? 他們也一個接一個地存儲嗎? 我認為 HBase 是面向列的

我到處都看到 HBase 是Wide-Column store ,它和 Column-oriented 一樣嗎?

在回答問題之前,我想指出有關 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

請注意, Qualifier1RowKey1RowKey2不相鄰。 相反,同一行的所有列(即RowKey1鍵)都是相鄰的。

如果您將每一列存儲在其自己的列族中,HBase 將成為一個真正的列式存儲,但由於其鎖定提供的單行跨列 ACID 語義,它將無法為數百萬列提供支持戰略來實現這一點。

編輯

鑒於HFile的上述結構,HFile數據實際上是根據以下鍵按排序格式存儲的(請注意,一個文件只能有一個家族,因此,將家族名稱存儲在數據本身中有些多余,但是有此問題的 scope 之外的其他用途):

RowKey:Family:Qualifier:Timestamp:Type

這種排序順序與 HFiles 上的塊級索引和布隆過濾器相結合,使 HBase 在定位任何隨機RowKeyRowKey、Family:Qualifier元組或RowKey、Family:Qualifier、Timestamp元組時速度非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM