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下。