Hbase
今天的主要內容
-
Hbase角色的了解
HMaster
HRegionServer
-
Hbase中的組件及其作用
HLog
Region
Store
MemStore
HFile
-
Hbase架構
- 一張圖
-
Hbase讀寫數據的流程(圖一定要熟悉)
Hbase讀數據流程
hbase寫數據流程
一、Hbase角色的理解
1. HMaster
監控 RegionServer
處理 RegionServer 故障轉移
處理元數據的變更
處理 region 的分配或移除
在空閑時間進行數據的負載均衡
通過 Zookeeper 發布自己的位置給客戶端
2. RegionServer
負責存儲 HBase 的實際數據
處理分配給它的 Region
刷新緩存到 HDFS
維護 HLog
執行壓縮
負責處理 Region 分片
二、Hbase中的組件及其作用
HLog——Write-Ahead logs
Region
Store
MemStore
HFile
1. Write-Ahead logs
HBase 的修改記錄
一個HRegionServer對應一個Hlog
Hlog中存放的是數據本身和對數據的操作
當對 HBase 讀寫數據的時候,數據不是直接寫進磁盤,它會在內存中保留一段時間(時間以及數據量閾值可以設定)。
但把數據保存在內存中可能有更高的概率引起數據丟失,為了解決這個問題,數據會先寫在一個叫做 Write-Ahead logfile 的文件中,然后再寫入內存中。
所以在系統出現故障的時候,數據可以通過這個日志文件重建。因為Hlog中存放的是數據本身和對數據的操作
2. Region
Hbase 表的分片
HBase 表會根據 RowKey 值被切分成不同的 region 存儲在 RegionServer 中,在一個 RegionServer 中可以有多個不同的 region。
RegionServer對應著多張表,一張table又對應著多個Region,一個Region維護著一個區間的row key
3. Store
HFile 存儲在 Store 中,一個 Store 對應 HBase 表中的一個列族(Column Family)。
一個Region中有多個Store
4. MemStore
就是內存存儲,位于內存中,用來保存當前的數據操作,所以當數據保存在 WAL中之后,RegsionServer 會在內存中存儲鍵值對。
一個store中對應著一個MemStore,當MemStore達到16k后,寫出到隊列,然后產生一個新的Memstore,存在隊列中的memstore實例化對象會被寫到HFile中,一個memstore對應一個HFile,因此,一個Store中有一個memstore,但是有多個HFile。
5. HFile
這是在磁盤上保存原始數據的實際的物理文件,是實際的存儲文件。
是存儲在HDFS中的。
由HregionServer進行定期合并的,HRegionServer通過調用HDFS的API進行HFile的合并。
三、Hbase架構
概念理解:
· Hbase是依賴于zookeeper和hdfs的
HBase 內置有 Zookeeper,但一般我們會有其他的 Zookeeper 集群來監管 master 和regionserver,Zookeeper 通過選舉,保證任何時候,集群中只有一個活躍的 HMaster
-
zookeeper中存儲了
HMaster和RegionServer狀態信息
HBase中數據的元數據尋址地址,也就是-ROOT-表的地址,即-ROOT-表存在于哪個RegionServer上
HMaster與 HRegionServer 啟動時會向 ZooKeeper 注冊,存儲所有 HRegion 的尋址入口,實時監控HRegionserver 的上線和下線信息。并實時通知給 HMaster,存儲 HBase 的 schema 和 table元數據。
默認情況下,HBase 管理 ZooKeeper 實例,Zookeeper 的引入使得 HMaster 不再是單點故障。一般情況下會啟動兩個 HMaster,非 Active 的 HMaster 會定期的和 Active HMaster通信以獲取其最新狀態,從而保證它是實時更新的,因而如果啟動了多個 HMaster 反而增加了 Active HMaster 的負擔。
一個 RegionServer 可以包含多個 HRegion,每個 RegionServer 維護一個 HLog,和多個 HFiles以及其對應的 MemStore。RegionServer 運行于 DataNode 上,數量可以與 DatNode 數量一致。
四、Hbase讀數據的流程
1. 尋址流程
Client訪問Zookeeper,獲取-ROOT-表的元數據信息,即表位于哪個RegionServer,并向客戶端返回此RegionServer的地址(交互一:Client與Zookeeper的交互)
Client通過獲取到的RegionServer的IP去訪問RegionServer(交互二:client和RegionServer·的交互)
Client接著讀取RegionServer中的-ROOT-表的內容,獲取到.META表的地址(交互三:client和-ROOT-的交互)
Client根據.META表的地址,訪問.META表,獲取到數據的元數據信息(交互四:client和.METAE的交互)
client根據獲取到的數據的元數據信息,去訪問對應的HRegionServer,然后掃描所在的MemeStore和storefile來查詢數據(交互五:client和數據本身的交互)
2. 尋址流程細節
-ROOT-表無論多大,都只有一個Region,存放著多條.META表的元數據信息,
.META表中有多個Region,存放關于實際數據的元數據
一個Table對應多個Region,一個Region維護一部分的row key
3. 在Region中讀取數據的具體流程
先到memstore中尋找,注意:memstore中存放的是用戶最近寫入的數據,如果沒有,則去Blockcache中讀取數據,注意:BlockCache中存放的是用戶最近讀取的數據。如果沒有,則去HFile中進行讀取
HFile中獲取到數據以后,現在Blockcache中進行緩存,然后再返回給客戶端
BlockCache中用到了LRUCache算法
五、Hbase寫入數據流程
先訪問zookeeper,確定當前將要寫入的數據所對應的 RegionServer 服務器和 Region。
Client 向該 RegionServer 服務器發起寫入數據請求,然后 RegionServer 收到請求并響應。
Client 先把數據寫入到 HLog,以防止數據丟失。
然后將數據寫入到 Memstore。
如果 Hlog 和 Memstore 均寫入成功,則這條數據寫入成功。在此過程中,如果 Memstore達到16kb,會把 Memstore 中的數據寫到一個隊列中。
當 Storefile 越來越多,會觸發 Compact 合并操作,把過多的 Storefile 合并成一個大的
尖叫提示:因為內存空間是有限的,所以說溢寫過程必定伴隨著大量的小文件產生。