千家信息网

HBase之MemStore+Flush详解

发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,MemStore简介:上图为HBase的读写过程的大概描述;写请求过程:client---------->WAL(Write Ahead LOG)----------->MemStore-------
千家信息网最后更新 2024年10月02日HBase之MemStore+Flush详解
  1. 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下。

0