天天看點

HBase系列(二):HBase架構及讀寫流程

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

HBase系列(二):HBase架構及讀寫流程

架構分析

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 讀寫過程

寫過程

  1. Client通路ZK,根據ROOT表擷取meta表所在Region的位置資訊,并将該位置資訊寫入Client Cache。

    (注:為了加快資料通路速度,我們将中繼資料、Region位置等資訊緩存在Client Cache中。)

  2. Client讀取meta表,再根據meta表中查詢得到的Namespace、表名和RowKey等相關資訊,擷取将要寫入Region的位置資訊(此過程即Region三層定位,如下圖),最後client端會将meta表寫入Client Cache。
  3. Client向上一步HRegionServer發出寫請求,HRegionServer先将操作和資料寫入HLog(預寫日志,Write Ahead Log,WAL),再将資料寫入MemStore,并保持有序。

    (聯想:HDFS中也是如此,EditLog寫入時機也是在真實讀寫之前發生)

  4. 當MemStore的資料量超過門檻值時,将資料溢寫磁盤,生成一個StoreFile檔案。

    當Store中StoreFile的數量超過門檻值時,将若幹小StoreFile合并(Compact)為一個大StoreFile。

    當Region中最大Store的大小超過門檻值時,Region分裂(Split),等分成兩個子Region。

具體合并與分裂過程我們接下來講解。

HBase系列(二):HBase架構及讀寫流程

Region三層定位

讀過程

  1. 擷取将要讀取Region的位置資訊(同讀的1、2步)。
  2. Client向HRegionServer發出讀請求。
  3. 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相關内容進行進一步研究。

繼續閱讀