BigTable類表模型理解
Row Key
與nosql數據庫們一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式:
- 通過單個row key訪問
- 通過row key的range
- 全表掃描
Row key行鍵 (Row key)可以是任意字符串(最大長度是 64KB,實際應用中長度一般爲 10-100bytes),在hbase內部,row key保存爲字節數組。
Hbase會對錶中的數據按照rowkey排序(字典順序),存儲時,數據按照Row key的字典序(byte order)排序存儲。
設計key時,要充分考慮排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)
注意:
字典序對int排序的結果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。
要保持整形的自然序,行鍵必須用0作左填充。
行的一次讀寫是原子操作 (不論一次讀寫多少列)。
這個設計決策能夠使用戶很容易的理解程序在對同一個行進行併發更新操作時的行爲。
列族Column Family
hbase表中的每個列,都歸屬與某個列族。
列族是表的schema的一部分(而列不是),必須在使用表之前定義。
列名都以列族作爲前綴。例如courses:history , courses:math 都屬於 courses 這個列族。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。
列族越多,在取一行數據時所要參與IO、搜尋的文件就越多,所以,如果沒有必要,不要設置太多的列族
列 Column
列族下面的具體列,屬於某一個ColumnFamily,類似於我們mysql當中創建的具體的列
時間戳timeStamp
HBase中通過row和columns確定的爲一個存貯單元稱爲cell。
每個 cell都保存着同一份數據的多個版本。版本通過時間戳來索引。
時間戳的類型是 64位整型。時間戳可以由hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。
時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。
每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,hbase提供了兩種數據版本回收方式:
保存數據的最後n個版本
保存最近一段時間內的版本(設置數據的生命週期TTL)。
用戶可以針對每個列族進行設置。
Cell
由{row key, column( = +
VersionNum
數據的版本號,每條數據可以有多個版本號,默認值爲系統時間戳,類型爲Long
筆記
Row Key
最大長度是 64KB,完全可以自行設計。Hbase會對錶中的數據按照rowkey排序(字典序)
row的設計是最有技術含量的工作
列族Column Family
列族是表的schema的一部分,而列不是。(schema包含表名和列族)
每個列都所屬於某一個列族。一個列族可以包含多個列。一個列族與列的關係是一對多。
列 Column
列族下面的具體列。
時間戳
標記一個數據的不同版本
時間戳可以由hbase(在數據寫入時自動 )賦值,hbase支持工程師自己定義時間戳。
每個 cell中,不同版本的數據按照時間倒序排序
hbase本身提供數據回收機制
1、保存數據的最後n個版本
2、保存最近一段時間內的版本
Cell存儲數據的最小單位
如何確定一個精確的數據
由{row key, column( = + ), version} 唯一確定的單元
VersionNum
數據的版本號,默認值爲系統時間戳。