1. 程式人生 > >HBase系列(二):HBase架構及讀寫流程

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

本篇博文從分析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 讀寫過程

寫過程

  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。

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

這裡寫圖片描述

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相關內容進行進一步研究。