本文系轉載,若有侵權,請聯繫我:likui0913@gmail.comcss
HBase 與 Google 的 BigTable 極爲類似,能夠說 HBase 就是根據 BigTable 設計的,這一點在 BigTable 論文中也能發現。html
在 BigTable 論文中提到了它的應用場景:數據庫
BigTable 是一個分佈式的結構化數據存儲系統,它被設計用來處理海量數據:一般是分佈在數千臺普通服務器上的 PB 級的數據。apache
Google 的不少項目使用 Bigtable 存儲數據,包括 Web 索引、Google Earth、Google Finance。這些應用對 Bigtable 提出的要求差別很是大,不管是在數據量上(從 URL 到網頁到衛星圖像)仍是在響應速度上(從後 端的批量處理到實時數據服務)。數組
Bigtable 已經在超過 60 個 Google 的產品和項目上獲得了應用,包括 Google Analytics、Google Finance、 Orkut、Personalized Search、Writely 和 Google Earth。服務器
以上應用場景的一個典型特色就是會不斷的插入新的數據,而不怎麼修改,好比Web 索引、Google Earth。而同時呢,也可能須要保存必定的歷史數據用以查看或分析,好比網頁快照、Google Analytics、或者聯想到現在的大數據中,根據您以往的行爲來預測您的行爲與喜愛等。另外它存儲的屬性可能會不少且不固定,好比一個網頁的數據,除了它的內容外,可能還須要存儲它相關的外鏈、關鍵字、錨點、標題、圖片等。分佈式
那麼根據這些應用的需求,對 BigTable 中的數據總結有如下特色:ide
在 HBase 中,數據存儲在具備行和列的表中,表的每行包含一個或多個列族,每一個列族則可能包含一個或多個列,而行與列的交叉點則被稱爲單元格,用來存放數據的值。大數據
Table 是在建立表時的 schema 聲明定義的,其一旦建立便不可修改。優化
與傳統關係係數據庫相似卻又不太相同,HBase 中的行具備以下特色:
列族是一個或多個列的集合,列能夠動態增減,可是列族則須要在建立或修改表時提早定義。同一個列族下的全部列使用相同的前綴來標識其屬於哪個列族,好比列courses:history
和courses:math
都是列族courses
的成員。
在物理存儲上,一個列族下的全部成員在文件系統上是存儲在一塊兒的,這個原理對於以後的優化有着重要的意義。
單元格是行與列的交叉點,同時由於版本的存在,因此它相似於一個3維元祖 {row, column, version},同行鍵同樣,單元格中的內容也是不可分割的字節數組。
以稍微修改過的 BigTable 論文中的 Webtable 爲例:有一個名爲 WebTable 的表格,其中包含兩行(com.cnn.www 和 com.example.www)和三個名爲 contents、anchor 和 people 的列族。對於第一行(com.cnn.www),anchor 包含兩列(anchor:cssnsi.com,anchor:my.look.ca),contants 包含一列(contents:html)。同時,row key 爲 com.cnn.www 的行保存了 5 個版本(5 個歷史數據),row key 爲 com.example.www 的行則只保存了 1 個版本。contents 列族中,html 列限定符中包含指定網站的整個 HTML 內容。anchor 列族中,每一個限定符都包含連接到該行所表明的站點的外部站點,以及它在連接錨點(anchor)中使用的文本。people 列族中則保存與該網站相關的人員。
那麼根據這個示例,能夠獲得以下的邏輯視圖與物理視圖。
Row Key | Time Stamp | ColumnFamily contents |
ColumnFamily anchor |
ColumnFamily people |
---|---|---|---|---|
「com.cnn.www」 | t9 | anchor:cnnsi.com = 「CNN」 | ||
「com.cnn.www」 | t8 | anchor:my.look.ca = 「CNN.com」 | ||
「com.cnn.www」 | t6 | contents:html = 「<html>…」 | ||
「com.cnn.www」 | t5 | contents:html = 「<html>…」 | ||
「com.cnn.www」 | t3 | contents:html = 「<html>…」 | ||
「com.example.www」 | t5 | contents:html = 「<html>…」 | people:author = 「John Doe」 |
與傳統的關係型數據庫不一樣的是,此表中爲空的單元格(Cell)在實際中並不會佔用空間或者說事實上並不存在,這正是 HBase 「稀疏」的緣由。使用表格只是查看 HBase 數據的一種方式,一樣也能夠轉換成 JSON 格式:
{ "com.cnn.www": { contents: { t6: contents:html: "<html>..." t5: contents:html: "<html>..." t3: contents:html: "<html>..." } anchor: { t9: anchor:cnnsi.com = "CNN" t8: anchor:my.look.ca = "CNN.com" } people: {} } "com.example.www": { contents: { t5: contents:html: "<html>..." } anchor: {} people: { t5: people:author: "John Doe" } } }
HBase 的數據按照列族(cloumn family)物理存儲。也便是說不一樣列族下的數據被分開存放,您能夠隨時將新的列限定符(column_family:column_qualifier)添加到現有的列族。對應上面的示例,它的物理存儲以下:
列族 anchor:
Row Key | Time Stamp | Column Family anchor |
---|---|---|
「com.cnn.www」 | t9 | anchor:cnnsi.com = 「CNN」 |
「com.cnn.www」 | t8 | anchor:my.look.ca = 「CNN.com」 |
列族 contents:
Row Key | Time Stamp | Column Family contents |
---|---|---|
「com.cnn.www」 | t6 | contents:html = 「<html>…」 |
「com.cnn.www」 | t5 | contents:html = 「<html>…」 |
「com.cnn.www」 | t3 | contents:html = 「<html>…」 |
列族 people:
Row Key | Time Stamp | Column Family people |
---|---|---|
「com.example.www」 | t5 | people:author = 「John Doe」 |
這樣的物理視圖有 3 個特色: