HBase
HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase 技術可在廉價 PC Server 上搭建起大規模結構化存儲集羣。
HBase簡介
HBase 是 Apache Hadoop 中的一個子項目,HBase 依託於 Hadoop 的 HDFS 作爲最基本存儲基礎單元,通過使用hadoop的DFS 工具就可以看到這些這些數據存儲文件夾的結構,還可以通過 Map/Reduce的框架(算法)對 HBase進行操作。
HBase適用場景
- 大數據量存儲,大數據量高併發操作
- 需要對數據隨機讀寫操作
- 讀寫訪問均是非常簡單的操作
HBase數據模型
HBase 以表的形式存儲數據。表由行和列族組成。列劃分爲若干個列族(row family)
- 行鍵(RowKey)
- 行鍵是字節數組, 任何字符串都可以作爲行鍵;
- 表中的行根據行鍵進行排序,數據按照 Row key 的字節序(byte order)排序存儲;
- 所有對錶的訪問都要通過行鍵 (單個 RowKey 訪問,或RowKey範圍訪問,或全表掃描)
- 列族(ColumnFamily)
- CF 必須在表定義時給出
- 每個 CF 可以有一個或多個列成員(ColumnQualifier),列成員不需要在表定義時給出,新的列族成員可以隨後按需、動態加入
- 數據按 CF 分開存儲,Hbase 所謂的列式存儲就是根據 CF 分開存儲(每個CF 對應一個 Store),這種設計非常適合於數據分析的情形
- 時間戳(TimeStamp)
- 每個 Cell可能又多個版本,它們之間用時間戳區分
- 單元格(Cell)
-
Cell 由行鍵,列族:限定符,時間戳唯一決定
-
Cell中的數據是沒有類型的,全部以字節碼形式存儲
- 區域(Region)
- HBase 自動把表水平(按 Row)劃分成多個區域(region),每個region 會保存一個表裏面某段連續的數據;
- 每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region 就會等分會兩個新的region;
- 當 table 中的行不斷增多,就會有越來越多的 region。這樣一張完整的表被保存在多個Region 上。
- Region 雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。Region由一個或者多個 Store 組成,每個 store 保存一個 columns family;每個Strore又由一個memStore和0至多個StoreFile組成, StoreFile包含HFile;memStore存儲在內存中,StoreFile 存儲在HDFS上
HBase架構及基本組件
1)Client:
- 包含訪問HBase的接口,並維護cache來加快對HBase的訪問,比如region的位置信息。
2)Master
- 爲Region server分配region
- 負責Region server的負載均衡
- 發現失效的Region server並重新分配其上的region
- 管理用戶對table的增刪改查操作
3)Region Server
- Regionserver維護region,處理對這些region的IO請求
- Regionserver負責切分在運行過程中變得過大的region
4)Zookeeper
- 通過選舉,保證任何時候,集羣中只有一個Master,Master與Regionservers啓動時會向ZooKeeper註冊
- 存儲所有Region的尋址入口
- 實時監控Region server的上線和下線信息,並實時通知給Master
- 存儲HBase的schema和table元數據
- 默認情況下,HBase管理ZooKeeper實例,比如,啓動或者停止ZooKeeper
- ZooKeeper的引入是的Master不再是單點故障
HBase容錯與恢復
每個 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,完成數據恢復