本篇博文從分析HBase架構開始,首先從架構中各個組成部分開始,接着從HBase寫入過程角度入手,分析HFile的Compaction合并、Region的Split分裂過程及觸發機制。

架構分析
1、HMaster
- 負責管理HBase中繼資料,即表的結構、表存儲的Region等元資訊。
- 負責表的建立,删除和修改(因為這些操作會導緻HBase中繼資料的變動)。
- 負責為HRegionServer配置設定Region,配置設定好後也會将中繼資料寫入相應位置(後面會詳細講述放在哪)。
如果對可用性要求較高,它需要做HA高可用(通過Zookeeper)。但是HMaster不會去處理Client端的資料讀寫請求,因為這樣會加大其負載壓力,具體的讀寫請求它會交給HRegionServer來做。
2、HRegionServer
- 一個RegionServer裡有多個Region。
- 處理Client端的讀寫請求(根據從HMaster傳回的中繼資料找到對應的Region來讀寫資料)。
- 管理Region的Split分裂、StoreFile的Compaction合并。
一個RegionServer管理着多個Region,在HBase運作期間,可以動态添加、删除HRegionServer。
3、HRegion
- 一個HRegion裡可能有1個或多個Store。
- HRegionServer維護一個HLog。
- HRegion是分布式存儲和負載的最小單元。
- 表通常被儲存在多個HRegionServer的多個Region中。
因為HBase用于存儲海量資料,故一張表中資料量非常之大,單機一般存不下這麼大的資料,故HBase會将一張表按照行水準将大表劃分為多個Region,每個Region儲存表的一段連續資料。 初始隻有1個Region,當一個Region增大到某個門檻值後,便分割為兩個。
4、Store
- Store是存儲落盤的最小單元,由記憶體中的MemStore和磁盤中的若幹StoreFile組成。
- 一個Store裡有1個或多個StoreFile和一個memStore。
- 每個Store存儲一個列族。
HBase 讀寫過程
寫過程
-
Client通路ZK,根據ROOT表擷取meta表所在Region的位置資訊,并将該位置資訊寫入Client Cache。
(注:為了加快資料通路速度,我們将中繼資料、Region位置等資訊緩存在Client Cache中。)
- Client讀取meta表,再根據meta表中查詢得到的Namespace、表名和RowKey等相關資訊,擷取将要寫入Region的位置資訊(此過程即Region三層定位,如下圖),最後client端會将meta表寫入Client Cache。
-
Client向上一步HRegionServer發出寫請求,HRegionServer先将操作和資料寫入HLog(預寫日志,Write Ahead Log,WAL),再将資料寫入MemStore,并保持有序。
(聯想:HDFS中也是如此,EditLog寫入時機也是在真實讀寫之前發生)
-
當MemStore的資料量超過門檻值時,将資料溢寫磁盤,生成一個StoreFile檔案。
當Store中StoreFile的數量超過門檻值時,将若幹小StoreFile合并(Compact)為一個大StoreFile。
當Region中最大Store的大小超過門檻值時,Region分裂(Split),等分成兩個子Region。
具體合并與分裂過程我們接下來講解。
Region三層定位
讀過程
- 擷取将要讀取Region的位置資訊(同讀的1、2步)。
- Client向HRegionServer發出讀請求。
- HRegionServer先從MemStore讀取資料,如未找到,再從StoreFile中讀取。
StoreFile合并(Compaction)
目的:減少StoreFile數量,提升資料讀取效率。
Compaction分為兩種:
-
major compaction
将Store下面**所有**StoreFile合并為一個StoreFile,此操作會删除其他版本的資料(不同時間戳的)
-
minor compaction
選取Store下的**部分**StoreFile,将它們合并為一個StoreFile,此操作不會删除其他版本資料。
Region分割(Split)
目的:實作資料通路的負載均衡。
做法:利用Middle Key将目前Region劃分為兩個等分的子Region。需要指出的是:Split會産生大量的I/O操作,Split開始前和Split完成後,HRegionServer都會通知HMaster。Split完成後,由于Region映射關系已變更,故HRegionServer會更新meta表。
以上,即是HBase詳細架構,以及在此架構上的讀寫操作的過程和可能發生的事件。後續博文會對HBase二級索引及BulkLoad相關内容進行進一步研究。