HBase隸屬於hadoop生態系統,它參考了谷歌的BigTable建模,實現的編程語言爲 Java, 建立在HDFS之上,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統。它僅能通過主鍵(row key)和主鍵的range來檢索數據,主要用來存儲非結構化和半結構化的鬆散數據。與hadoop一樣,HBase目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。HBase數據庫中的表一般有這樣的特點:
- 大:一個表可以有上億行,上百萬列
- 面向列: 面向列(族)的存儲和權限控制,列(族)獨立檢索
- 稀疏:對於爲空(null)的列,並不佔用存儲空間,因此,表可以設計的非常稀疏
體系架構:
Client的主要功能:
- 使用HBase的RPC機制與HMaster和HRegionServer進行通信
- 對於管理類操作,Client與HMaster進行RPC
- 對於數據讀寫類操作,Client與HRegionServer進行RPC
Zookeeper功能:
- 保證任何時候,集羣中只有一個master,Master與RegionServers 啓動時會向ZooKeeper註冊
- 實時監控Region server的上線和下線信息,並實時通知給Master
- 存儲所有Region的尋址入口和HBase的table元數據
HMaster功能:
- 管理HRegionServer,實現其負載均衡
- 管理和分配HRegion,比如在HRegion split時分配新的HRegion;在HRegionServer退出時遷移其內的HRegion到其他HRegionServer上
- 監控集羣中所有HRegionServer的狀態(通過Heartbeat和監聽ZooKeeper中的狀態)
HRegionServer功能:
- Region server維護Master分配給它的region,處理對這些region的IO請求
- Region server負責切分在運行過程中變得過大的region
小結:
·client訪問hbase上數據的過程並不需要master參與(尋址訪問zookeeper,數據讀寫訪問regione server),master僅僅維護者table和region的元數據信息,負載很低
·HRegion所處理的數據儘量和數據所在的DataNode在一起,實現數據的本地化
數據模型:
-
Table: 與傳統關係型數據庫類似,HBase以表(Table)的方式組織數據,應用程序將數據存入HBase表中
-
Row: HBase表中的行通過 RowKey 進行唯一標識,不論是數字還是字符串,最終都會轉換成字段數據進行存儲;HBase表中的行是按RowKey字典順序排列
-
Column Family: HBase表由行和列共同組織,同時引入列族的概念,它將一列或多列組織在一起,HBase的列必須屬於某一個列族,在創建表時只需指定表名和至少一個列族
-
Cell: 行和列的交叉點稱爲單元格,單元格的內容就是列的值,以二進制形式存儲,同時它是版本化的
-
version: 每個cell的值可保存數據的多個版本(到底支持幾個版本可在建表時指定),按時間順序倒序排列,時間戳是64位的整數,可在寫入數據時賦值,也可由RegionServer自動賦值
注意:
- HBase沒有數據類型,任何列值都被轉換成字符串進行存儲與關係型數據庫在創建表時需明確包含的列及類型不同,HBase表的每一行可以有不同的列
- 相同RowKey的插入操作被認爲是同一行的操作。即相同RowKey的二次寫入操作,第二次可被可爲是對該行某些列的更新操作
- 列由列族和列名連接而成, 分隔符是冒號,如d:Name(d:列族名,Name:列名)
小結:
- HBase不支持條件查詢和Order by等查詢,讀取記錄只能按Row key(及其range)或全表掃描
- 在表創建時只需聲明表名和至少一個列族名,每個Column Family爲一個存儲單元
- 設計一個HBase表在實際應用中強烈建議使用單列族
- Column不用創建表時定義即可以動態新增,同一Column Family的Columns會羣聚在一個存儲單元上,並依Column key排序,因此設計時應將具有相同I/O特性的Column設計在一個Column Family上以提高性能。注意:這個列是可以增加和刪除的,這和我們的傳統數據庫很大的區別。所以他適合非結構化數據
- HBase通過row和column確定一份數據,這份數據的值可能有多個版本,不同版本的值按照時間倒序排序,即最新的數據排在最前面,查詢時默認返回最新版本。
- Timestamp默認爲系統當前時間(精確到毫秒),也可以在寫入數據時指定該值
·每個單元格值通過4個鍵唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value - 存儲類型
- TableName 是字符串
- RowKey 和 ColumnName 是二進制值(Java 類型 byte[])
- Timestamp 是一個 64 位整數(Java 類型 long)
- value 是一個字節數組(Java類型 byte[])
HBase尋址,Client訪問用戶數據時如何找到某個row key所在的region?
0.94- 版本,Client訪問用戶數據之前需要首先訪問zookeeper,然後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數據的位置去訪問,中間需要多次網絡操作,如下圖:
0.96+版本刪除了root 表,改爲zookeeper裏面的文件,如下圖 A, 以讀爲例,尋址示意圖如B: