HBase篇(3)-架構詳解

【每日五分鐘搞定大數據】系列,HBase第三篇
緩存

聊完場景和數據模型咱們來講下HBase的架構,在網上找了張比較清晰的圖,我以爲這張圖能說明不少問題,那這一篇咱們就重點來解析下這張圖服務器

角色與職責

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

1.HMaster負載均衡

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

2.Client分佈式

Client包含訪問HBase的接口,並維護cache(region的位置信息)來加快對HBase的訪問大數據

3.Zookeeperspa

在以前的Zookeeper篇講過HBase和Zookeeper的聯繫,忘記地同窗能夠去翻一下。3d

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

4.HRegionSeverserver

即一臺服務器,擁有一個到多個HRegionblog

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

相關文章
相關標籤/搜索