一個典型的Hbase Table 表以下:html
Row Key
是用來檢索記錄的主鍵。想要訪問HBase Table中的數據,只有如下三種方式:git
Row Key
進行訪問;Row Key
能夠是任意字符串,存儲時數據按照Row Key
的字典序進行排序。這裏須要注意如下兩點:github
HBase表中的每一個列,都歸屬於某個列族。列族是表的Schema的一部分,因此列族須要在建立表時進行定義。列族的全部列都以列族名做爲前綴,例如courses:history
,courses:math
都屬於courses
這個列族。數據庫
列限定符,你能夠理解爲是具體的列名,例如courses:history
,courses:math
都屬於courses
這個列族,它們的列限定符分別是history
和math
。須要注意的是列限定符不是表Schema的一部分,你能夠在插入數據的過程當中動態建立列。apache
HBase中的列由列族和列限定符組成,它們由:
(冒號)進行分隔,即一個完整的列名應該表述爲列族名 :列限定符
。緩存
Cell
是行,列族和列限定符的組合,幷包含值和時間戳。你能夠等價理解爲關係型數據庫中由指定行和指定列肯定的一個單元格,但不一樣的是HBase中的一個單元格是由多個版本的數據組成的,每一個版本的數據用時間戳進行區分。服務器
HBase 中經過row key
和column
肯定的爲一個存儲單元稱爲Cell
。每一個Cell
都保存着同一份數據的多個版本。版本經過時間戳來索引,時間戳的類型是 64位整型,時間戳能夠由HBase在數據寫入時自動賦值,也能夠由客戶顯式指定。每一個Cell
中,不一樣版本的數據按照時間戳倒序排列,即最新的數據排在最前面。數據結構
HBase Table中的全部行按照Row Key
的字典序排列。HBase Tables 經過行鍵的範圍(row key range)被水平切分紅多個Region
, 一個Region
包含了在start key 和 end key之間的全部行。架構
每一個表一開始只有一個Region
,隨着數據不斷增長,Region
會不斷增大,當增大到一個閥值的時候,Region
就會等分爲兩個新的Region
。當Table中的行不斷增多,就會有愈來愈多的Region
。負載均衡
Region
是HBase中分佈式存儲和負載均衡的最小單元。這意味着不一樣的Region
能夠分佈在不一樣的Region Server
上。但一個Region
是不會拆分到多個Server上的。
Region Server
運行在HDFS的DataNode上。它具備如下組件:
最近最少使用原則
清除多餘的數據。Region Server存取一個子表時,會建立一個Region對象,而後對錶的每一個列族建立一個Store
實例,每一個Store
會有 0 個或多個StoreFile
與之對應,每一個StoreFile
則對應一個HFile
,HFile 就是實際存儲在HDFS上的文件。
HBase系統遵循Master/Salve架構,由三種不一樣類型的組件組成:
Zookeeper
Master
Region Server
HBase使用ZooKeeper做爲分佈式協調服務來維護集羣中的服務器狀態。 Zookeeper負責維護可用服務列表,並提供服務故障通知等服務:
更爲詳細寫入流程能夠參考:HBase - 數據寫入流程解析
如下是客戶端首次讀寫HBase上數據的流程:
META
表所在的Region Server;META
表所在的Region Server,從META
表中查詢到訪問行鍵所在的Region Server,以後客戶端將緩存這些信息以及META
表的位置;若是再次讀取,客戶端將從緩存中獲取行鍵所在的Region Server。這樣客戶端就不須要再次查詢META
表,除非Region移動致使緩存失效,這樣的話,則將會從新查詢並更新緩存。
注:META
表是HBase中一張特殊的表,它保存了全部Region的位置信息,META表本身的位置信息則存儲在ZooKeeper上。
更爲詳細讀取數據流程參考:
本篇文章內容主要參考自官方文檔和如下兩篇博客,圖片也主要引用自如下兩篇博客:
官方文檔:
更多大數據系列文章能夠參見我的 GitHub 開源項目: 大數據入門指南