HBase –Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。
HBase訪問接口
- Native Java API,最常規和高效的訪問方式,適合Hadoop MapReduce Job并行批處理HBase表數據
- HBase Shell,HBase的命令行工具,最簡單的接口,適合HBase管理使用
- Thrift Gateway,利用Thrift序列化技術,支持C++,PHP,Python等多種語言,適合其他異構系統在線訪問HBase表數據
- REST Gateway,支持REST 風格的Http API訪問HBase, 解除了語言限制
- Pig,可以使用Pig Latin流式編程語言來操作HBase中的數據,和Hive類似,本質最終也是編譯成MapReduce Job來處理HBase表數據,適合做數據統計
- Hive,當前Hive的Release版本尚沒有加入對HBase的支持,但在下一個版本Hive 0.7.0中將會支持HBase,可以使用類似SQL語言來訪問HBase Phoenix
HBase數據模型
-
Table & Column Family
hbase_table.png
- Row Key 行鍵
與nosql數據庫一樣,row key是用來表示唯一一行記錄的主鍵,HBase的數據時按照RowKey的字典順序進行全局排序的,所有的查詢都只能依賴于這一個排序維度。訪問HBASE table中的行,只有三種方式:- 通過單個row key訪問;
- 通過row key的range(正則)
- 全表掃描
- Timestamp: 時間戳,每次數據操作對應的時間戳,可以看作是數據的version number
- Columns Family 列族
列簇:HBASE表中的每個列,都歸屬于某個列族。列族是表的schema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如courses:history,courses:math 都屬于courses這個列族 - Cell:由{row key,columnFamily,version} 唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存儲。關鍵字:無類型、字節碼
- Time Stamp 時間戳
HBASE中通過rowkey和columns確定的為一個存儲單元稱為cell。每個cell都保存著同一份數據的多個版本。版本通過時間戳來索引。
所以之間的關系是:
- 表是行的集合。
- 行是列族的集合。
- 列族是列的集合。
- 列是鍵值對的集合。
- Table & Region
當Table隨著記錄數不斷增加而變大后,會逐漸分裂成多份splits,成為regions,一個region由[startkey,endkey)表示,不同的region會被Master分配給相應的RegionServer進行管理。
HRegionServer是HBase中最核心的模塊,主要負責響應用戶I/O請求,向HDFS文件系統中讀寫
table在行的方向上分隔為多個Region。Region是HBase中分布式存儲和負載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個Region是不會拆分到多個server上。
Region按大小分隔,每個表一般是只有一個region。隨著數據不斷插入表,region不斷增大,當region的某個列族達到一個閥值(默認256M)時就會分成兩個新的region。
每個region由以下信息標識:
- <表名,startRowKey,創建時間>
- 由目錄表(-ROOT-和.META.)記錄該region的endRowKey
- HRegion定位:Region被分配給哪個RegionServer是完全動態的,所以需要機制來定位Region具體在哪個region server。
所以之間的關系是:
- HRegionServer管理一系列HRegion對象:
- 每個HRegion對應Table中一個Region,HRegion由多個HStore組成;
- 每個HStore對應Table中一個Column Family的存儲;
- Column Family就是一個集中的存儲單元,故將具有相同IO特性的Column放在一個Column Family會更高效。
- HBase使用三層結構來定位region
- 通過zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region
- 通過-ROOT-表查找.META.表的第一個表中相應的region的位置。其實-ROOT-表是.META.表的第一個region;.META.表中的每一個region在-ROOT-表中都是一行記錄
- 通過.META.表找到所要的用戶表region的位置。用戶表中的每個region在.META表中都是一行記錄
-
其他概念:
HStore : HBase存儲的核心。由MemStore和StoreFile組成。MemStore是Stored Memory Buffer
HLog : 引入HLog原因:在分布式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況
HLog工作機制:
每個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log的類,每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件,HLog文件定期會滾動出新,并刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止后,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog文件,將不同region的log數據拆分,分別放到相應region目錄下,然后再將失效的region重新分配,領取到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然后flush到StoreFiles,完成數據恢復HMaster :
HBase可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master在運行
主要負責Table和Region的管理工作:
管理用戶對表的增刪改查操作
管理HRegionServer的負載均衡,調整Region分布Region Split后,負責新Region的分布
在HRegionServer停機后,負責失效HRegionServer上Region遷移
HBase的存儲格式
HBase中的所有數據文件都存儲在Hadoop HDFS文件系統上,格式主要有兩種:
- HFile,HBase中Key-Value數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile。
- HLog File,HBase中WAL(Write Ahead Log)的存儲格式,物理上是Hadoop的Sequence File
HFile文件不定長,長度固定的塊只有兩個:Trailer和FileInfo
Trailer中指針指向其他數據塊的起始點
File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點
Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機制
每個Data塊的大小可以在創建一個Table的時候通過參數指定,大號的Block有利于順序Scan,小號Block利于隨機查詢
每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞
HFile里面的每個KeyValue對就是一個簡單的byte數組。這個byte數組里面包含了很多項,并且有固定的結構
KeyLength和ValueLength:兩個固定的長度,分別代表Key和Value的長度
Key部分:Row Length是固定長度的數值,表示RowKey的長度,Row 就是RowKey
Column Family Length是固定長度的數值,表示Family的長度
接著就是Column Family,再接著是Qualifier,然后是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)
Value部分沒有這么復雜的結構,就是純粹的二進制數據