hbase批量put出现 RegionTooBusyException,over memstore limit =512.0m
在使用BufferedMutator批量put数据到hbase时,程序在运行一段时间后,会出现RegionTooBusyException的异常,异常报的是超过了memstore的限制。
通过查看报出异常的源代码,找到原因
意思是Region在每次进行put时,会进行resource的检查。而这个512M是怎么来的呢?
hbase.hregion.memstore.flush.size 默认128M
hbase.hregion.memstore.block.multiplier 默认4 数的作用是当memstore的大小增至memstore.size的4倍时,阻塞所有请求,遏制风险进一步扩大。
当一个region里的memstore超过memstore.size4倍大小时,会阻塞该region的所有请求,进行flush,释放内存。虽然我们设置了memstore的总大小,比如64m,但想象一下,在最后63.9M的时候,我们put了一个100M的数据,此时memstore的大小会瞬间暴涨到超过预期的memstore.size的几倍。
为什么memstore中数据会堆积到超过阈值呢?
我们都知道memstore flush操作会生成一个storeFile,当storeFile达到一定数量时会进行compaction操作。而当一个store内的storeFile文件数量超过指定值,则针对该region的更新会被锁定,直到一个压缩完成或者达到指定时间。
hbase.hstore.blockingStoreFiles 配置文件数
hbase.hstore.blockingWaitTime 配置等待时间
但是,在阻塞的时候,put操作还是在进行,最终导致数据堆积到超过阈值。
怎么减少该问题的产生呢?
当出现上述异常时,hbase会进行重试操作,重试的默认上限是35次,一般重试10多次左右,会成功。你要想在代码中捕获到该异常,可以减少hbase.client.retries.number参数的值。
- 增加分区数量,将请求分散到多个不同的分区上
- 适当调整hbase参数
- 权衡put写入的速度于hbase处理数据的速度
hbase.hregion.memstore.flush.size
memstore大小,当达到该值则会flush
hbase.hstore.blockingStoreFiles
当某一个region的storefile个数达到该值则block写入
hbase.hregion.memstore.block.multiplier
超过memstore大小的倍数达到该值则block所有写入请求
hbase.hstore.blockingWaitTime
stroe等待compaction的超时时间
hbase.regionserver.thread.compaction.small
small compact线程池的线程个数
等相关参数