Flush(数据刷写)
Flush的两种级别
1.单个store的memstore级别
2.整个regionServer的memstore级别
触发条件
Flush时机1:hbase.hregion.memstore.flush.size
#参数配置:
hbase.hregion.memstore.flush.size = 134217728
#说明:
当某个store中的memstore的存储达到 128M(默认)
#问题
但是问题来了,因为MemStore的刷写存在一个定期检查时间,有时候可能数据增长速度太快,在还未达到检查时间之前,数据就达到了hbase.hregion.memstore.flush.size的好几倍,从而被阻塞住了。
Flush时机2:globalMemStoreSize
#版本1
概念:globalMemStoreSize表示全局memstore容量(regionServer的全局memstore),这个值计算方法如下:
hbase_heapsize(Regionserver 占用堆内存大小) * hbase.regionserver.global.memstore.size
hbase.regionserver.global.memstore.size的默认值是0.4。
hbase.regionserver.global.memstore.size.lower.limit = 0.95 #默认是0.95
#当全局memstore使用达到该值时,将会有多个MemStores flush到文件中。MemStore flush顺序是按照大小降序执行的,直到刷新到全局MemStore大小刚好小于该值。
一旦全局MemStorer容量达到 regionserverHeapSize * hbase.regionserver.global.memstore.size * hbase.regionserver.global.memstore.size.lower.limit 就会触发一次强制的刷写。
#版本2:两个版本参数不一样,功能一样
hbase.regionserver.global.memstore.upperLimit <==> hbase.regionserver.global.memstore.size
hbase.regionserver.global.memstore.lowerLimit <==>
hbase.regionserver.global.memstore.size * hbase.regionserver.global.memstore.size.lower.limit
Flush时机3:WAL的数量大于maxLogs
WAL的数量大于maxLogs时,也会触发一次刷写,不过不会发生阻塞事件,倒是会警告一下。该参数其实新版本已经不需要进行设置了,最大就是32,也可以更小,根据hbase.regionserver.global.memstore.size来决定:
Math.max(32,(regionserverHeapSize*memstoreSizeRatio*2/logRollSize))
Flush时机4:定时刷写
hbase.regionserver.optionalcacheflushinterval = 3600000
#表示memstore的刷写间隔,默认值是3600000,即1个小时。如果设定为0,则意味着关闭自动刷写。
Flush时机5:手动刷写
API:
flush(TableName tableName):对单表进行刷写。
flushRegion(byte[] regionName):对单个Region进行刷写。
HBase Shell:
flush ‘tablename’
flush 'regionname'
阻塞情况
阻塞情况1:达到阻塞倍数(达到flush的倍数)
hbase.hregion.memstore.flush.size 默认阈值是128MB
hbase.hregion.memstore.block.multiplier:是一个倍数,默认是4。
#上面两个数的乘积默认为512M,因为MemStore的刷写存在一个定期检查时间,在下一次刷写检查到来之前若达到了这个阈值,就会立即触发刷写,同时阻塞住所有的写入该Store的写请求。
阻塞情况2:当hbase_heapsize(Regionserver 占用堆内存大小) * hbase.regionserver.global.memstore.size 大小达到阈值时就会阻塞整个HBase集群的写入。
举例:hBase堆内存的大小为16GB,hbase.regionserver.global.memstore.size是0.4
,hbase.regionserver.global.memstore.lowerLimit为0.95
,那么触发刷写的阈值为:
16*0.4*0.95=6.08
举例:hBase堆内存的大小为16GB,hbase.regionserver.global.memstore.size是
0.4,hbase.regionserver.global.memstore.lowerLimit为0.95
那么触发阻塞的阈值为:
16*0.4=6.4
真实案例:hbase_heapsize(Regionserver
占用堆内存大小)配置太小,数据没怎么写入就出现写不进去了。
#案例总结:当全局MemStore达到6.08G时候开始Flush,此时不阻塞。 此时如果写的速度大于Flush速度,当全局MemStore达到6.4G时候就会阻塞Hbase写入,直到降到6.4G一下才会解除阻塞。
关闭自动Flush
在工作中需要关闭自动flush,如果自动触发会影响正在运行的其他业务。
解决:写脚本,手动flush
1.将命令写入文件,一行一个,最后一个命令一定要是exit
2.使用bin/hbase shell file_path