2.Hbase的讀寫流程


  Hbase框架不同於一般框架,一般框架都是讀快寫慢,而Hbase恰恰相反,他的寫要更快些。

  寫數據流程:

  1.發出請求:

    (第一次交互)客戶端通過Zookeeper的調度,通過它上面的meta表,找到meta表所在的HregionServer位置信息,返回給客戶端;

    (第二次交互)客戶端再次交互上面所獲取的HregionServer,通過你要查的這張表的表名和RowKey,找到這條數據所在的表的具體位置(多個HregionServer中的具體某一個),將該HregionServer返回給客戶端;

    (第三次交互)客戶端通過二所獲取的HregionServer找到所在位置,進行寫操作。到這里寫數據就完成了。

  注意:老版本里zookeeper還有一個-root-表,他記錄的是.meta.表的信息,就是在最開始多了一次交互。

  2.寫到內存后落盤:

    數據寫入到Hregion的Memstore(內存)中,直到達到閾值(128M),進行flush操作,持久化到StoreFile;

  3.“先合再分”:

    在Hregion上,StoreFile文件不斷增多,到達一個閾值后(一般3-10個文件),進行Compact合並操作,合成一個StoreFile,而不斷的合並,達到一定閾值后,進行split溢寫操作,把當前Hregion分成兩個Hregion(由HregionServer負責),同時父Hregion下線,生成的兩個新的被Hmaster分配到相應的HregionServer上。寫數據完成。

  由此可見,Hbase只有增添數據的操作,我們的修改和刪除都是再后續的Compact中得以實現(覆蓋原數據:根據rowkey+列簇+列全部對應后,如果全一致,就會生一個新的版本,

也就是時間戳,你下次讀對應的數據他會返回給你最新的版本),客戶端進行寫數據操作時,只要進入內存,就立刻返回,這也正是Hbase的IO高效所在原因

 

  讀數據流程:

  HBase讀取數據兩種方式:get和scan

  通常我們都是根據rowkey來查找,

  • 從rowkey來找這張表table,而table從行的方向上又分為了多個region,每一個region他有一個特殊屬性:startkey - endkey,這樣就能判斷你的rowkey是否在這個region上。region里對應又有多個store(存放的是列簇)。
  • 找到他所在的region便可找到他所在的regionserver,因為最終客戶端還是要和regionserver進行交互。

  1.客戶端訪問Zookeeper,查找-root-表(之前我所提的“根表”),獲取.meta.表信息,它里面存的是所有表的元數據(在哪個region上),進而找到在哪一個HregionServer上維護。

  2.HregionServer的內存分為Memstroe和BlockCache兩部分,前者主要用來寫數據,后者主要用來讀數據。當讀數據 請求過來時,先到Memstore中查找,找不到再去BlockCache中查,再查不到才去StoreFile上讀,讀到后把結果返回並放入到BlockCache(下次再查這條就更快了)。

  這里就把memstore看成一個記憶緩存,blockcache堪稱是一個二級緩沖。

  歸納下:

  client >> zookeeper >> -root- >> .meta. >> Hregion >> HregionServer >> client

  由此可見:

    讀寫數據流程其實並不需要Hmaster的參與,這部分工作依賴於zookeeper,這時即便你的Hmaster宕掉也不影響。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM