MemStore存在的意义是在写入HDFS前,将其中的数据整理有序。
MemStore刷写时机
1.当某个memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所在region的所有memstore都会刷写.注意是所有的Region下所有的memstore,
列族通常是以表为单位的.Hbase在插入数据的时候是以行为单位插入的.一般插入数据的时候是多个列族都有可能插入数据.一旦其中一个列族到了128M了,那么其它的列族也有可能到128M了.那么就顺带一起刷新了.当你memstore进行刷写到StoreFile的时候会占用所在机器的磁盘IO.如果memstore频繁的刷写的话会占用当前机器的磁盘io,影响别的进程的读写效率.这就是为什么一个memstore达到了阈值,当前region下所有的memstore一起跟着刷写到storefile的原因了.
当memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M)乘以hbase.hregion.memstore.block.multiplier(默认值4)时,会阻止继续往该memstore写数据。
memstore一旦达到128M的时候就开始刷写数据了,但是刷写数据的时候regionserver还可以接收写请求的.你客户端还可以往memstore里面放数据的.如果你刷写速度比较慢的话,而往当前memstore写数据的速度很快,那么有可能这个memstore会迅速的膨胀.膨胀到512m的时候就不往这个memstore里面写了.
2.当region server中memstore的总大小达到Java堆的大小乘以hbase.regionserver.global.memstore.size(默认值0.4)再乘以hbase.regionserver.global.memstore.size.lower.limit(默认值0.95),此时即使单个memstore没有达到128M,依然会触发刷写.说白了就是memstore占用Java内存太多了也会触发刷写.region会按照其所有memstore的大小顺序(由大到小)依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下。当region server中memstore的总大小达到Java堆乘以hbase.regionserver.global.memstore.size(默认值0.4)时,会阻止继续往所有的memstore写数据.
3.到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)。
4.当WAL文件的数量超过hbase.regionserver.max.logs以后,说明memstore里面的数据也比较多了.region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.max.log以下(该属性名已经废弃,现无需手动设置,最大值为32)。
WAL文件记录的是HBase在memstore里面写的数据,一旦memstore刷写完数据到storefile文件里面之后,wal文件会挪到oldWALs(在HDFS上的HBase根目录)目录里面.
如果公司业务有高并发场景的话可以给hbase.hregion.memstore.flush.size参数调大一点 ,不然的话,频繁刷写memstore会占用机器磁盘io影响效率.
HBase是非常吃内存的,如果条件允许的话可以尝试给机器的一半儿内存都给HBase的堆