1. 程式人生 > >HBase篇(3)-架構詳解

HBase篇(3)-架構詳解

【每日五分鐘搞定大資料】系列,HBase第三篇

聊完場景和資料模型我們來說下HBase的架構,在網上找了張比較清晰的圖,我覺得這張圖能說明很多問題,那這一篇我們就重點來解析下這張圖

角色與職責

先介紹下上圖中的幾個角色和Ta們的職責:

1.HMaster

  • 為Region server分配region;
  • 負責Region server的負載均衡;
  • 發現失效的Region server並重新分配其上的region;
  • 處理schema更新請求

2.Client

Client包含訪問HBase的介面,並維護cache(region的位置資訊)來加快對HBase的訪問

3.Zookeeper

在之前的Zookeeper篇講過HBase和Zookeeper的聯絡,忘記地同學可以去翻一下。

  • HMaster的HA
  • regionserver狀態資訊
  • 存root表(用於記錄.META.表所在的regionServer,該表只會有一個regionServer)
  • 儲存HBase的schema和table元資料
  • 發現失效的Region,藉助HMaster分配region

4.HRegionSever

即一臺伺服器,擁有一個到多個HRegion

RegionServer

圖裡HRegionServer裡面的內容很多,大家可能會看得有點懵,我們來詳細說下這個HRegionServer裡面的東西。

HRegionServer 包含 (1+)個 Region

一個 HRegionServer 包含一到多個Region,而Region就是一張HBase表按一定閾值橫向切割的一部分。

Region按大小分割的,每個表開始只有一個region,隨著資料增多,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region,之後會有越來越多的region;

Region是Hbase中分散式儲存和負載均衡的最小單元,不同Region分佈到不同RegionServer上;

Region 包含 (1+)個 Store = columns family 列族個數

Region由一個或者多個Store組成,每個store儲存一個columns family;

Store 是一個抽象的概念就是一個儲存,它的個數和HDFS上的儲存目錄個數是一致的,而一個儲存目錄對應的就是一個columns family列族。

Store 包含(1)個 MemStore +(0+)個 StoreFile

Store 上面說了就是一個儲存,他包含了一個記憶體的儲存和0+個檔案儲存,一個Store的所有檔案都存在一個目錄下,這個目錄下的所有檔案對應的是一個列族。 注意:

  • StoreFile是實際儲存資料的。是HFile的輕量級包裝。
  • StoreFile達到閾值個數(4)會進行合併;
  • 一個StoreFile達到閾值大小會進行分裂;
  • 分裂後由hmaster分配到不同region起到負載均衡作用(若出現hot region可以手動拆分)

上面說得可能有點抽象,我們來看具體的資料: 我們來沿用下上一篇的那個表:

如表

假設這張表有幾萬行,一行就代表一萬行,那可能A和B可能是屬於RegionA,C和D可能是屬於RegionB,

RegionA和RegionB可能分佈在不同的RegionServer上,

可見,RegionA有兩個列族,CF1和CF2,

即它有兩個Store,

即在HDFS上有兩個目錄分別用於存放CF1和CF2,

即CF1和CF2在記憶體裡也分別各對應了一個MemStore

讀寫

這裡先講個大概,後面的文章我會每一步詳細分析,比如region的分裂過程,StoreFile的合併過程,rowkey的定位詳細流程等等,歡迎持續關注。

Region定位流程:

  • Zookeeper:記錄了-ROOT-表的位置。
  • -ROOT-:記錄.META.表所在的region列表,該表只會有一個Region;
  • .META.:根據給定的key找到RegionServer。.META.記錄所有的使用者空間region列表,以及RegionServer的伺服器地址。

    寫流程

  1. 向zookeeper發起請求,從ROOT表中獲得META所在的region,再根據table,namespace,rowkey,去meta表中找到目標資料對應的region資訊以及regionserver
  2. 把資料分別寫到HLog和MemStore上一份 MemStore達到一個閾值後則把資料刷成一個StoreFile檔案。若MemStore中的資料有丟失,則可以總HLog上恢復 當多個StoreFile檔案達到一定的大小後,會觸發Compact合併操作,合併為一個StoreFile,這裡同時進行版本的合併和資料刪除。 當Compact後,逐步形成越來越大的StoreFIle後,會觸發Split操作,把當前的StoreFile分成兩個,這裡相當於把一個大的region分割成兩個region

    讀流程

  3. 從zookeeper獲得root表所在region位置
  4. 根據table,namespace,rowkey去root表中獲得meta表所在region位置
  5. 根據table,namespace,rowkey去meta表中獲得這條記錄所在regionserver
  6. 首先檢查請求的資料是否在Memstore,寫快取未命中的話再到讀快取(blockCache)中查詢,讀快取還未命中才會到HFile檔案中查詢,最終返回merged的一個結果給使用者
  7. client端會對資料塊快取

    資料flush過程

  8. 當memstore資料達到閾值(預設是64M),將資料刷到硬碟,將記憶體中的資料刪除同時刪除Hlog中的歷史資料。
  9. 並將資料儲存到hdfs中。
  10. 在hlog中做標記點。

    資料合併過程

  11. 當資料塊達到4塊,hmaster將資料塊載入到本地,進行合併
  12. 當合並的資料超過256M,進行拆分,將拆分後的region分配給不同的hregionserver管理
  13. 當hregionser宕機後,將hregionserver上的hlog拆分,然後分配給不同的hregionserver載入,修改.META.
  14. 注意:hlog會同步到hdfs