1. 程式人生 > >2.HBase_儲存與讀寫流程

2.HBase_儲存與讀寫流程

我們看到HBase叢集的物理模型,包括:Client、ZooKeeper、HMaster、HRegionServer、HLog、HRegion、Store、StoreFile、MemStore。對於HBase,它的元資料存放在ZooKeeper中,真實資料存放在MemFile(記憶體)和StoreFile(HDFS)中。

一. 寫資料過程

(1) Client先把資料寫入到HLog中。(HLog是標準的HadoopSequenceFile。由於Log資料量小,而且是順序寫,速度非常快)

(2) 同時把資料寫到記憶體Memstore中,成功返回給Client。(HBase寫的速度非常快,因為資料只要寫到記憶體就算成功了)

(3) 然後檢查Memstore是否已滿。如果滿了,HRegionServer會啟動FlashCache程序,把記憶體中的MemStore重新整理到HDFS,形成一個新的HFile。

(4) HFile是HBase使用的底層儲存格式,HFile對應於列族,一個列族可以有多個HFile,但一個HFile不能儲存多個列族的資料,HFile集合稱作StroeFile。

(5) 當StoreFile檔案的數量增長到一定的閾值後,系統就會進行合併,在合併過程中會進行版本合併和刪除工作,形成更大的Storefile。

(6) 當StoreFile大小超過一定的閾值後,就會把當前的Region分割為兩個Split,並由HMaster分配到相應的HRegionServer,實現負載均衡。

注意:
    大型分散式系統中硬體故障很常見,HBase也不例外。
    HBase通過在寫動作發生之前先寫入WAL(即:HLog)。
    HBase叢集中每臺伺服器維護一個WAL來記錄發生的變化。

二. 讀資料過程

  • 由於無法直接修改HBase裡的資料,所有的Update和Delete操作都轉換成Append操作。而且HBase裡也沒有索引,因此讀資料都是以Scan的方式進行。
  • Client在讀資料時,一般會指定TimeStamp和ColumnFamily。根據ColumnFamily和TimeStamp可以過濾掉很大一部分Store,然後在剩下的Store中Scan。
  • 在ZooKeeper中有HBase的兩個預設名稱空間:default和hbase。其中hbase中存放的都是系統內建表(使用者建立的namespace和meta表);default中存放未指定名稱空間的表。

(1) Client訪問Zookeeper,查詢META表資訊。 

(2) 從META表查詢,獲取存放目標資料的Region資訊,從而找到對應的RegionServer。 

(3) 通過RegionServer獲取需要查詢的資料。 

(4) RegionServer的記憶體分為MemStore和BlockCache兩部分,MemStore主要用於寫資料,BlockCache主要用於讀資料。讀請求先到MemStore中查資料,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,並把讀的結果放入BlockCache。 

總結:Client–>Zookeeper–>META表–>RegionServer–>Region–>Client

三.HBase Admin(寫資料時,合併Compaction過程)

  • minor compaction:輕量級合併過程。將符合條件的一開始生成的多個storefile合併成一個大的storfile,此時不會刪除被標記為"delete"的資料和已經過期的資料。執行一次minor合併操作後,還會有多個storefile檔案。
  • major compaction:重量級合併過程。把所有storefile合併成單一的storefile檔案,在合併過程中會把標記為"刪除"的資料和過期資料一併刪除。合併過程中,對請求該Region的所有客戶端阻塞,直到合併完畢。最後刪除參與合併的(小)storefile檔案。