hbase表結構
HBase 設計
HBase 中的每一張表就是所謂的 BigTable。BigTable 會存儲一系列的行記錄,行記錄有三個基本類型的定義:Row Key、Time Stamp、Column。
1、Row Key 是行在 BigTable 中的唯一標識。
2、Time Stamp 是每次數據操作對應關聯的時間戳,可以看做 SVN 的版本。
3、Column 定義為< family>:< label>,通過這兩部分可以指定唯一的數據的存儲列,family 的定義和修改需要 對 HBase 進行類似于 DB 的 DDL 操作,而 label ,不需要定義直接可以使用,這也為動態定制列提供了一種手段 。family 另一個作用體現在物理存儲優化讀寫操作上,同 family 的數據物理上保存的會比較臨近,因此在業務設計的過程中可以利用這個特性。
數據模型
HBase 以表的形式存儲數據。表由行和列組成。列劃分為若干個列族(row family),如下圖所示。

1、 Row Key
與 NoSQL 數據庫一樣,Row Key 是用來檢索記錄的主鍵。訪問 HBase table 中的行,只有三種方式:
1)通過單個 Row Key 訪問。
2)通過 Row Key 的 range 全表掃描。
3)Row Key 可以使任意字符串(最大長度是64KB,實際應用中長度一般為 10 ~ 100bytes),在HBase 內部,Row Key 保存為字節數組。
在存儲時,數據按照 Row Key 的字典序(byte order)排序存儲。設計 Key 時,要充分排序存儲這個特性,將經常一起讀取的行存儲到一起(位置相關性)。
注意 字典序對 int 排序的結果是 1,10,100,11,12,13,14,15,16,17,18,19,20,21,..., 9,91,92,93,94,95,96,97,98,99。要保存整形的自然序,Row Key 必須用 0 進行左填充。
行的一次讀寫是原子操作(不論一次讀寫多少列)。這個設計決策能夠使用戶很容易理解程序在對同一個行進行并發更新操作時的行為。
2、 列族
HBase 表中的每個列都歸屬于某個列族。列族是表的 Schema 的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴,例如 courses:history、courses:math 都屬于 courses 這個列族。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。在實際應用中,列族上的控制權限能幫助我們管理不同類型的應用, 例如,允許一些應用可以添加新的基本數據、一些應用可以讀取基本數據并創建繼承的列族、一些應用則只允許瀏覽數據(甚至可能因為隱私的原因不能瀏覽所有數據)。
3、 時間戳
HBase 中通過 Row 和 Columns 確定的一個存儲單元稱為 Cell。每個 Cell 都保存著同一份數據的多個版本。 版本通過時間戳來索引,時間戳的類型是 64 位整型。時間戳可以由HBase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也 可以由客戶顯示賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。每個 Cell 中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的管理(包括存儲和索引)負擔,HBase 提供了兩種數據版本回收方式。 一是保存數據的最后 n 個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
4、 Cell
Cell 是由 {row key,column(=< family> + < label>),version} 唯一確定的單元。Cell 中的數據是沒有類型的,全部是字節碼形式存儲。
物理存儲
Table 在行的方向上分割為多個HRegion,每個HRegion分散在不同的RegionServer中。

每個HRegion由多個Store構成,每個Store由一個memStore和0或多個StoreFile組成,每個Store保存一個Columns Family

StoreFile以HFile格式存儲在HDFS中。