HBase簡介
HBase是一個構建在HDFS上的、分佈式的、面向列的開源數據庫,它是Apache Hadoop生態系統中的重要一員。
與mysql、oracle等關係型數據庫RDBMS基於行模式的存儲不同,HBase是基於列模式進行存儲的,這使得它非常適合於存儲海量非結構化或者半結構化的數據。通常HBase 需要構建在HDFS之上,並將其內部管理的數據文件全部存儲在HDFS中。
HBase與RDBMS比較
RDBMS |
HBase |
|
存儲模式 |
面向行 |
面向列(族) |
事務支持 |
多行ACID |
單行 |
查詢語言 |
SQL |
提供簡單的查詢API,get/put/scan ... |
索引支持 |
任意列可添加索引 |
Row key索引 |
數據規模 |
TB |
PB |
讀寫效率 |
1000/s |
百萬/s |
表結構 |
數萬行,上千列 |
數億行,百萬列 |
數據結構 |
每行的列完全相同 |
每行的列可以不同 |
數據佈局 |
空列也佔用存儲空間,緊湊 |
空列不佔用存儲空間,稀疏 |
數據多版本 |
不支持 |
支持,默認以時間戳作爲版本號 |
數據類型 |
多種類型 |
僅支持字符串(Byte array ) |
HBase與HDFS比較
相同點
HBase與HDFS都具有良好的容錯性和擴展性,都可以擴展到成百上千個節點。
不同點
HDFS適合批處理場景,不支持數據隨機查找、不適合增量數據處理、不支持數據更新。而這些HDFS不適用的這些場景剛好HBase都能滿足。
Hbase數據模型
HBase是基於Google BigTable模型開發的,典型的key/value系統。
Row Key
Row Key 可以看作是表中每條記錄的“主鍵”。
Column Family
Column Family 包含一個或者多個相關Column(列)。
Column
Column 屬於某一個 Column Family,包含在某一列中: familyName:columnName。
Version Number
每個唯一的 Row Key 可以同時保存多個版本的記錄,默認以系統時間戳作爲版本號,類型爲Long。Version Number也可由用戶指定,無需以遞增的順序插入。
Hbase物理模型
每個Column Family存儲在HDFS上的一個單獨文件中,Row Key和 Version Number在每個 Column Family中均有一份。
例如,上例中的多版本數據在Hbase中其實是這麼存儲的。
HBase 爲每個值維護了多級索引,即:<key, column family, column name, timestamp>。
物理存儲
Hbase會將Table中的所有行都按照row key的字典序排列,並將Table 在行的方向上分割爲多個Region。
Region會按大小進行分割,每個表開始只有一個Region,隨着數據增多, Region不斷增大,當增大到一個閥值的時候,Region就會等分成兩個新的region,之後會有越來越多的Region。
Region是HBase中分佈式存儲和負載均衡的最小單元。不同Region分佈到不同RegionServer上。
Region雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。
每個Region由一個或者多個Store組成,每個store保存一個Column Family,每個Strore又由一個memStore和0至多個StoreFile組成。memStore 存儲在內存中, StoreFile存儲在HDFS或者磁盤上。用戶寫入的數據最先會保存在memStore 中,當memStore 中存儲的數據大小達到一定閾值的時候會將其寫入到StoreFile。
HBase架構
Client
Client包含訪問HBase的接口,並維護cache來加快對HBase的訪問。
Zookeeper
HBase 使用 ZooKeeper 來實現 Master的高可用。Master與RegionServers啓動時會向ZooKeeper進行註冊。當Master不可用時,ZooKeeper 會自動選舉一個RegionServer作爲新的Master,避免Master單點故障。
在HBase中ZooKeeper 主要的職責如下:
- 保證任何時候,集羣中有且只有一個Master
- 保存所有Region的尋址入口
- 實時監控Region server的上線和下線信息,並實時通知給Master
- 存儲HBase的schema和table元數據
默認情況下, HBase 管理ZooKeeper 實例,比如, 啓動或者停止ZooKeeper。
Master
- 爲Region server分配region
- 負責Region server的負載均衡
- 發現失效的Region server並重新分配其上的region
- 管理用戶對table的增刪改查操作
Region Server
- 維護region,處理對這些region的IO請求
- 負責切分在運行過程中變得過大的region
Write-Ahead-Log( WAL)
WAL(Write-Ahead-Log)預寫日誌是Hbase的RegionServer在處理數據插入和刪除的過程中用來記錄操作內容的一種日誌。
Client 向RegionServer提交數據的時候,RegionServer首先會將操作日誌寫入到HLog文件中去,只有當WAL日誌寫入成功的時候,客戶端纔會被告訴提交數據成功,然後再真正提交操作。這樣做的好處是,即使數據寫入Region失敗,也能夠根據WAL日誌中的記錄進行重試,防止數據丟失。
HBase容錯性
Master容錯
當Master不可用時,Zookeeper會重新選擇一個新的Master。
- 無Master過程中,數據讀取仍照常進行;
- 無master過程中, Region切分、負載均衡等無法進行;
RegionServer容錯
RegionServer定時向Zookeeper彙報心跳,如果一段時間內未出現心跳,Master會將該RegionServer上的Region重新分配到其他RegionServer上,並將失效服務器上WAL“預寫”日誌由主服務器進行分割並派送給其他RegionServer。
Region定位
當用戶通過 Row Key 檢索某一條記錄時,Hbase需要先定位到記錄所在的Region,然後再進行查找。
- 從 ZooKeeper 獲取到 -ROOT- 表所在的Location,-ROOT-表包含.META.表所在的Region列表,這個表只會有一個Region;
- 從.META.表中獲取到要檢索的記錄所在的Region,.META.表包含所有的用戶表的Region列表,以及RegionServer的服務器地址;
- 在Region中檢索出相應的數據;
Hbase支持的操作
Hbase所有操作均是基於Row Key的,支持CRUD( Create、 Read、 Update和Delete)和Scan。Hbase沒有內置Join操作,可使用MapReduce解決。
單行操作:
- Put
- Get
- Scan
多行操作:
- Scan
- MultiPut