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