HBase之MemStore+Flush詳解

  1. MemStore簡介:安全

              

    上圖爲HBase的讀寫過程的大概描述;ide


    寫請求過程:client---------->WAL(Write Ahead LOG)----------->MemStore-------------> HFile--------->END優化

    讀請求過程:client---------->MemStore-------->BlockCache------->HFile------------>ENDspa


    MemStore在HBase中的位置:日誌

       HBase是由Master和HRegionServer組成,而實際在讀寫的過程當中,咱們與Master打交道的機會不是不少,主要是HRegionServer,從上圖能夠看出每個HRegionServer由一個HLog和多個Region構成,一個Region中存在多個Store,每個Strore由一個MemStore和多個StoreFile構成,MemStore爲HBase在內存中的一塊區域,StoreFile的底層爲HFile,其爲HDFS中的文件。orm

    MemStore在什麼時候起做用:server

       寫:當client端發起一個寫操做時,寫操做首先被寫入到WAL中,而後寫入到MemStore中,當達到必定的預設條件以後,MemStore中內容會刷寫到StoreFile中,寫操做完成。內存

       (那麼問題來了ci

         1.爲何要先寫入到WAL中呢?it

           WAL爲HDFS中的文件,MemStore爲內存中的一塊區域,一提到內存咱們就能想到,不安全,上面看到只有在MemStore中數據刷寫到StoreFile中時,數據纔會落盤,寫入到磁盤中,因此當咱們在因爲系統宕機等狀況下,MemStore中數據丟失,還將來得及刷寫落盤,HBase會根據存儲在HDFS中的WAL文件恢復數據。

         2.Flush(刷寫)的策略?

           下文會進行詳細講解。

       讀:當client端發起一個讀操做時,HBase會首先在對應Region的MemStore中查找,若是找不到,則會到BlockCache中查找(BlockCache爲HBase的一個優化讀的策略,下文會詳解),若是尚未,則會到StoreFile(HFile)中查找,讀操做完成。


2.Flush簡介

  

  Flush爲HBase中的一個重要的操做,咱們必須配置一個很好的flush的策略,從而保證HBase集羣的穩定。

  Flush爲HBase數據落盤的一個操做,Flush後數據纔會持久起來,每一次Flush會在Region中產生一個StoreFile並刪除在WAL中的edits。

  Flush爲Region級,當一個Region中的一個Store中的MemStore達到預設條件後,一個Region中的全部的Sotre.

  下面爲在Flush一個表時的日誌:

   

2014-10-18 16:58:28,801 INFO  [Priority.RpcServer.handler=1,port=60020] regionserver.HRegionServer: Flushing t1,,1413622522846.58fd75078b4a47b8c6a20705f23209b7.

2014-10-18 16:58:28,816 DEBUG [Priority.RpcServer.handler=1,port=60020] regionserver.HRegion: Started memstore flush for t1,,1413622522846.58fd75078b4a47b8c6a20705f23209b7., current region memstore size 168

2014-10-18 16:58:29,457 INFO  [Priority.RpcServer.handler=1,port=60020] regionserver.DefaultStoreFlusher: Flushed, sequenceid=3, memsize=168, hasBloomFilter=true, into tmp file hdfs://beh/hbase/data/default/t1/58fd75078b4a47b8c6a20705f23209b7/.tmp/6ad49d65c8b94b678bab3c892bdb0d03

2014-10-18 16:58:29,733 DEBUG [Priority.RpcServer.handler=1,port=60020] regionserver.HRegionFileSystem: Committing store file hdfs://beh/hbase/data/default/t1/58fd75078b4a47b8c6a20705f23209b7/.tmp/6ad49d65c8b94b678bab3c892bdb0d03 as hdfs://beh/hbase/data/default/t1/58fd75078b4a47b8c6a20705f23209b7/cf/6ad49d65c8b94b678bab3c892bdb0d03

2014-10-18 16:58:29,838 INFO  [Priority.RpcServer.handler=1,port=60020] regionserver.HStore: Added hdfs://beh/hbase/data/default/t1/58fd75078b4a47b8c6a20705f23209b7/cf/6ad49d65c8b94b678bab3c892bdb0d03, entries=1, sequenceid=3, filesize=1021

2014-10-18 16:58:29,879 INFO  [Priority.RpcServer.handler=1,port=60020] regionserver.HRegion: Finished memstore flush of ~168/168, currentsize=0/0 for region t1,,1413622522846.58fd75078b4a47b8c6a20705f23209b7. in 1063ms, sequenceid=3, compaction requested=false


能夠看出,先將MemStore flush到.tmp下,而後移動到region目錄下對應的columnFamily下。

相關文章
相關標籤/搜索