HBase 介紹
HBase的數(shù)據(jù)的存儲結(jié)構(gòu)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,HBase是一種結(jié)構(gòu)松散,分布式,多維度有序映射的持久化存儲系統(tǒng),它索引的依據(jù)是行鍵、列鍵和時間戳。
HBase可以被看作鍵值存儲數(shù)據(jù)庫、面向列族的數(shù)據(jù)庫,外文原文地址請點擊。
HBase 數(shù)據(jù)存儲模型基礎(chǔ)
HBase數(shù)據(jù)存儲結(jié)構(gòu)中主要包括:表、行、列族、列限定符、單元格和時間戳,下面將對HBase的數(shù)據(jù)存儲模型的概念一一解釋:
表: 表的作用將存儲在HBase的數(shù)據(jù)組織起來。
行: 行包含在表中,數(shù)據(jù)以行的形式存儲在HBase的表中。HBase的表中的每一行數(shù)據(jù)都會被一個唯一標識的行鍵標識。行鍵沒有數(shù)據(jù)類型,在HBase存儲系統(tǒng)中行鍵總是被看作一個byte數(shù)組。
列族: 在行中的數(shù)據(jù)都是根據(jù)列族分組,由于列族會影響存儲在HBase中的數(shù)據(jù)的物理布置,所以列族會在使用前定義(在定義表的時候就定義列族),并且不易被修改。
在HBase的存儲系統(tǒng)中數(shù)據(jù)存儲在相同的表中的所有行的數(shù)據(jù)都會有相同的列族(這和關(guān)系型數(shù)據(jù)庫的表一樣,每一行數(shù)據(jù)都有相同的列)。
列限定符: 存儲在在列族中的數(shù)據(jù)通過列限定符或列來尋址的,列不需要提前定義(不需要在定義表和列族的時候就定義列),列與列之間也不需要保持一致。列和行鍵一樣沒有數(shù)據(jù)類型,并且在HBase存儲系統(tǒng)中列也總是被看作一個byte數(shù)組。
單元格: 根據(jù)行鍵、列族和列可以映射到一個對應的單元格,單元格是HBase存儲數(shù)據(jù)的具體地址。在單元格中存儲具體數(shù)據(jù)都是以Byte數(shù)組的形式存儲的,也沒有具體的數(shù)據(jù)類型。
時間戳: 時間戳是給定值的一個版本號標識,每一個值都會對應一個時間戳,時間戳是和每一個值同時寫入HBase存儲系統(tǒng)中的。在默認情況下,時間戳表示數(shù)據(jù)服務(wù)在寫入數(shù)據(jù)時的時間,但可以在將數(shù)據(jù)放入單元格時指定不同的時間戳值。
HBase 數(shù)據(jù)模型理解
HBase中存儲的數(shù)據(jù),表組織結(jié)構(gòu)如圖一所示:

圖一為HBase中的一個表,由兩個列族(Personal和Office)組成,每個列族都有兩列。 包含數(shù)據(jù)的實體稱為單元格,行根據(jù)行鍵進行排序。
為了更好的理解HBase中的多維數(shù)據(jù)存儲模型,這里從上圖的表中摘出一條數(shù)據(jù),將它在HBase的表中的存儲轉(zhuǎn)化成如圖二所表示的形式去理解他。

如果將HBase表中的數(shù)據(jù)理解成鍵值對存儲的形式,那么也可以用如圖三的形式來理解存儲在HBase表中的數(shù)據(jù)。

Hbase表設(shè)計要點
-
行鍵是HBase表結(jié)構(gòu)設(shè)計中最重要的一件事情,行鍵決定了應用程序如何與HBase表進行交互。如果沒設(shè)計好行鍵還會影響從HBase中讀出數(shù)據(jù)的性能。
- HBase的表結(jié)構(gòu)很靈活,而且不關(guān)心數(shù)據(jù)類型,你可以以byte數(shù)組的形式存儲任何數(shù)據(jù)。
- 存儲在相同的列族中的數(shù)據(jù)具有相同的特性(易于理解)。
- HBase主要是通過
行鍵來建立索引。
- HBase不支持多行事務(wù),所有盡量在一次API請求操作中獲取到結(jié)果。
- HBase中的
鍵可以通過提取其hash值來保證鍵長度是固定的和均勻分布,但是這樣做會犧牲鍵的數(shù)據(jù)排序和可讀性。
-
列限定符和列族名字的長度都會影響I/O的讀寫性能和發(fā)送給客戶端的數(shù)據(jù)量,所以給它們命名的時候應該盡量簡短!