HBase Flush刷写时机条件和阻塞情况

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

你可能感兴趣的:(hbase,数据库,大数据)