记一次Hbase RegionTooBusyException的处理记录

hbase批量put出现 RegionTooBusyException,over memstore limit =512.0m

在使用BufferedMutator批量put数据到hbase时,程序在运行一段时间后,会出现RegionTooBusyException的异常,异常报的是超过了memstore的限制。
通过查看报出异常的源代码,找到原因
在HRegion.checkResources()找到异常信息
意思是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参数的值。

  1. 增加分区数量,将请求分散到多个不同的分区上
  2. 适当调整hbase参数
  3. 权衡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线程池的线程个数
等相关参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值