本文所述版本為HBase2.X
從HBase官方文檔的說法伞广,HBase是一個multi-dimensional map(多維表)糊秆,BigTable論文中也稱BigTable為"sparse,distributed, persistent multidimensional sorted map"认烁,這個說法可以根據(jù)它的整個表設計來看。在HBase的表設計中膛虫,有Row,Column,Column Family饶碘,Column Qualifier,Cell馒吴,Timestamp扎运。
- Row,HBase中的一行由行鍵和一列或多列與它們相關聯(lián)的值組成饮戳。在每一行中有一個非常重要的概念叫做rowkey豪治,它是依照順序字母去排序的,這樣的好處是它的scan操作可以得到很好的優(yōu)化扯罐,帶來的問題是负拟,如果分布不均勻的化,在分布式的存儲中篮赢,將會造成一塊數(shù)據(jù)存儲在同一個region齿椅,對于單節(jié)點壓力過大的問題。所以通常對于rowkey的設計是使用例如SHA-1的散列算法作為開頭启泣,然后拼接實際的業(yè)務Id涣脚。
- Column,HBase中的列由列族和列限定符組成寥茫,它們由:(冒號)字符分隔遣蚀。
- Column Family,在HBase中一個列簇的數(shù)據(jù)是存儲在一起的纱耻,一個列簇下可以有多個列芭梯。在通常的設計中,一般不建議設計過多的列簇弄喘。這樣做的目的是size較大的數(shù)據(jù)和小size的關鍵數(shù)據(jù)可以分列簇存儲玖喘,在一些查詢操作中可以做到高效。
- cell:單元格蘑志,由五元組(row, column, timestamp, type, value)組成的結構累奈,代表該值的版本贬派。
- Column Qualifier,一個columnfamily下可以設置任意多個qualifier澎媒,因此可以理解為HBase中的列可以動態(tài)增加搞乏,理論上甚至可以擴展到上百萬列。比如
content:html
,content:pdf
戒努,content為列簇请敦,html和pdf為列名。 - timestamp储玫,時間戳侍筛,每個cell在寫入HBase的時候都會默認分配一個時間戳作為該cell的版本,當然缘缚,用戶也可以在寫入的時候自帶時間戳勾笆。
視圖
在說物理視圖和邏輯視圖之前敌蚜,我們先說說兩者之間的區(qū)別桥滨。
物理視圖指反映當前系統(tǒng)的組織機構、輸入輸出弛车、資源利用情況和日常數(shù)據(jù)處理過程的模型齐媒。
邏輯視圖指在物理模型的基礎上進行分析,區(qū)分出本質(zhì)的和非本質(zhì)的因素纷跛,去掉那些非本質(zhì)的因素喻括,特別是非本質(zhì)的物理因素,從而形成反映系統(tǒng)本質(zhì)的模型贫奠。
從HBase角度來講唬血,我們大體可以理解為邏輯視圖是我們看待HBase整個表用存儲結構整體的視圖結構,物理視圖則是其中的一些細節(jié)部分唤崭,以及邏輯視圖沒能表現(xiàn)出來的細節(jié)拷恨。
邏輯視圖
從官網(wǎng)文檔的一張圖來看
有一個名為webtable的表,其中包含兩行(com.cnn.www和com.example.www)和三個列族谢肾,分別名為content腕侄,anchor和people。 在此示例中芦疏,對于第一行(com.cnn.www)冕杠,列簇anchor包含兩列(anchor:cssnsi.com,anchor:my.look.ca)酸茴,列簇contents包含一列(contents:html)分预。 示例包含行鍵com.cnn.www的行的5個版本,以及行鍵com.example.www的行的一個版本薪捍。 content:html列限定符包含給定網(wǎng)站的整個HTML笼痹。 anchor列簇的列均包含鏈接到該行表示的站點的外部站點魁淳,以及在其鏈接的anchor中使用的文本。 people列簇代表與該站點關聯(lián)的人員与倡。
物理視圖
概念視圖中顯示的空單元格根本不存儲界逛。 因此,在時間戳記t8處對content:html列的值的請求將不返回任何值纺座。但是息拜,如果未提供時間戳,則將返回特定列的最新值净响。 給定多個版本時候少欺,因為時間戳以降序存儲,所以最新的也是找到的第一個版本馋贤。因此赞别,如果未指定時間戳,則對com.cnn.www行中所有列的值的請求將是:來自時間戳t6的content:html的值配乓,來自時間戳t9的anchor:cnnsi.com的值仿滔, 時間戳記t8中的anchor:my.look.ca。
Namespace
命名空間是表的邏輯分組犹芹,類似于關系數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)庫崎页。
Version
在HBase中版本是降序存儲的,所以腰埂,如果不指定版本獲取數(shù)據(jù)飒焦,將拿到最新版本。
版本的設計結構如下
hbase> alter ‘t1′, NAME => ‘f1′, VERSIONS => 5
Join
HBase不支持Join操作屿笼。
但是牺荠,這并不意味著不能進行聯(lián)表查詢,而意味著得自己去做驴一。 兩種主要策略是在寫入HBase時對數(shù)據(jù)進行非規(guī)范化休雌,也就是說把數(shù)據(jù)存儲在一張表中』着浚或者在應用執(zhí)行中具有添加一個查找表挑辆,進行兩個表的關聯(lián)。