列如:
hbase.hregion.memstore.flush.size为128m,hbase.hregion.memstore.block.multiplier默认为2。所以达到hbase.hregion.memstore.flush.size的2倍时(128*2=256m)等于256m时就会发生阻塞。所以我们要调高阻塞阈值。
7、hbase.hregion.memstore.flush.size
hbase.hregion.memstore.flush.size:默认值128M。一般不会去做改变。
8、hbase.hstore.blockingStoreFiles
hbase.hstore.blockingStoreFiles:默认为7。调高为20。因为如果任何一个Store的StoreFiles数超过hbase.hstore.blockingStoreFiles(默认为7)就会发生阻塞。直到合并完成或超过hbase.hstore.blockingWaitTime(默认为90m)所指定的时间为止。
注意:hbase的写操作会首先在memStore中生效,然后等到memStore达到一定大小以后就会写入HDFS,从而省出一部分内存空间。memStore写磁盘的操作以后台的方式运行,使用的是memStore快照。所以,即便是memStore写磁盘时,hbase仍然可以一直处理写操作。这使得hbase的写入速度非常的快。如果写磁盘的峰值高到memstore跟不上。那么写操作填满memStore就会不断提高。memStore的内存占用也会不断升高。memStore达到一定阈值,更新又会被阻塞,并且进行强制写入磁盘。
所以要调整memStore总体内存的大小避免发生更新阻塞
1、hbase.regionserver.global.memstore.upperLimit
hbase.regionserver.global.memstore.upperLimit:默认值0.4超过该值后,新的更新就会被阻塞,并且强制进行写盘。这是一项可以防止hbase在写高峰时耗尽内存的配置信息,默认0.4意味着占用服务器堆内存的40%。
该默认值在很多情况下都可以很好的发生作用,但是如果服务器日志中出现许多含有Flush of region xxx due to global heap pressure的日志,那么就需要调整该属性。不建议太大,可配置为0.45。因为block cache和memstore cache的总大小不会超过0.8,而且不建议这两个cache的大小总和达到或者接近0.8,避免OOM。
2、hbase.regionserver.global.memstore.lowerLimit
hbase.regionserver.global.memstore.lowerLimit:默认值0.35。它指定了何时对memStore进行强制写磁盘,系统会一直进行写盘,直到memStore所占用的总内存大小低于该属性的值为止。默认0.35意味着服务器堆大小的35%。