HBase-MemStore触发刷写的六种时机
MemStore Flush
所有的flush都是以Region为单位刷新
1)MemStore级别
当 Region中 某个 MemStore 的大小达到了hbase.hregion.memstore.flush.size(默认值128M)
,会触发Region的刷写(若Region中有多个Store,只要有其中一个达到hbase.hregion.memstore.flush.size(默认值128M)
值,就会触发flush,每个Store都会生成一个StroeFile文件,可能会生成多个小文件,所以一般情况下,一个Region只设置一个列簇(即一个Store))
2)Region级别
当处于写高峰的时候,会延迟触发第一个时机(MemStore级别)
当 Region 中的MemStore的总大小达到了hbase.hregion.memstore.flush.size(默认值128M)* hbase.hregion.memstore.block.multiplier(默认值4)
时,会阻塞所有写入该 Region 的写请求,优先flush!这时候如果往 MemStore 写数据,会出现 RegionTooBusyException
异常。
- 举个例子:当 Region 中的某个 MemStore 占用内存达到128M ,会触发flush ,此时是允许写入操作的;若写入操作大于 flush 的速度,当 Region 中的所有 MemStore 占用内存达到 128 * 4 = 512M 时,阻止所有写入该 Region 的写请求,直到Region 中的所有 MemStore ,flush完毕,才取消阻塞,允许写入。
3)RegionServer级别
当RegionServer中,所有Region中的MemStore的总大小达到java_heapsize * hbase.regionserver.global.memstore.size(默认值0.4)* hbase.regionserver.global.memstore.size.lower.limit(默认值0.95)
会flush,flush的时候根据每个Region中,总MemStore占用的大小进行降序排序,依次flush;flush的时候优先flush占用空间大的region,每flush一个region,会查看总的占用大小是否小于 java_heapsize * hbase.regionserver.global.memstore.size(默认值0.4)* hbase.regionserver.global.memstore.size.lower.limit(默认值0.95)
;如果还是大于,则继续flush region,若小于,则停止flush(注:此情况是允许memStore写入的)
当处于写高峰的时候,会延迟触发第三个时机(HRegionServer级别)
当RegionServer中,所有Region中的MemStore的总大小达到了 java_heapsize * hbase.regionserver.global.memstore.size(默认值0.4)
时,会阻塞当前 RegionServer 的所有写请求(无法往Region中的MemStore写入数据),直到RegionServer中,所有Region中的MemStore的总大小 低于 java_heapsize * hbase.regionserver.global.memstore.size(默认值0.4)* hbase.regionserver.global.memstore.size.lower.limit(默认值0.95)
时,才取消阻塞(允许写入数据)
- 举个例子,如果 HBase 堆内存总共是 10G,按照默认的比例,那么触发 RegionServer级别的flush ,是 RegionServer 中所有的 MemStore 占用内存为:
10 * 0.4 * 0.95 = 3.8G
时触发flush,此时是允许写入操作的,若写入操作大于flush的速度,当占用内存达到10 * 0.4 = 4G
时,阻止所有写入操作,直到占用内存低于3.8G
,才取消阻塞,允许写入。
4)HLog级别
当WAL文件的数量超过hbase.regionserver.maxlogs
,region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.maxlogs
以下(该属性名已经废弃,现无需手动设置,最大值为32)。
WAL 数量触发的刷写策略是,找到最旧的 un-archived WAL 文件,并找到这个 WAL 文件对应的 Regions, 然后对这些 Regions 进行刷写。
5)定期刷写
到达自动刷写的时间,也会触发MemStore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)
,指的是当前 MemStore 1小时会进行一次刷写。如果设定为0,则关闭定时自动刷写。
6)手动刷写
可以通过 shell 命令"flush ‘table’"或者"flush ‘regionname’"分别对一个Region或者多个Region进行flush