您好,登錄后才能下訂單哦!
MemStore簡介:
上圖為HBase的讀寫過程的大概描述;
寫請求過程:client---------->WAL(Write Ahead LOG)----------->MemStore-------------> HFile--------->END
讀請求過程:client---------->MemStore-------->BlockCache------->HFile------------>END
MemStore在HBase中的位置:
HBase是由Master和HRegionServer組成,而實際在讀寫的過程中,我們與Master打交道的機會不是很多,主要是HRegionServer,從上圖可以看出每一個HRegionServer由一個HLog和多個Region構成,一個Region中存在多個Store,每一個Strore由一個MemStore和多個StoreFile構成,MemStore為HBase在內存中的一塊區域,StoreFile的底層為HFile,其為HDFS中的文件。
MemStore在何時起作用:
寫:當client端發起一個寫操作時,寫操作首先被寫入到WAL中,然后寫入到MemStore中,當達到一定的預設條件之后,MemStore中內容會刷寫到StoreFile中,寫操作完成。
(那么問題來了
1.為什么要先寫入到WAL中呢?
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下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。