HBase Put及flush

1. Put及flush

a. Client提交put,若设置autoflush=false,则直接提交到regionserver,若为true,则等到2M或者执行hbase.flushcommits()提交给rs.

b. Put到Regionserver层次,先判断则这台regionserver的 所有memstore的总占用内存是否大于最大值内存(heap size *hbase.regionserver.global.memstore.upperLimit(0.4)),若大于 则提交一个对象到flushqueue中,这时flushthread线程不停的从flushqueue中获得请求,然后选择其中一个region进行Flush,直到这台regionserver的 所有memstore的总占用内存小于最小内存(heap size *hbase.regionserver.global.memstore. lowerLimit(0.35)),而regionserver主线程在等待5秒后,判断若小于最大内存,则继续提交put到region上,否则一直提交对象到flushqueue。

c. Region层次, Put时,一个HRegion中所有HStore中MemStore的总Size大于hbase.hregion.memstore.flush.size(64MB)*hbase.hregion.memstore.block.multiplier(2)时. 先flush,再等待10秒再检查是否大于, 若不大于,则继续执行此次put.否则继续等待

在flush region时会先检查整个region内所有store中任一个store 的总storefile是不是太多了(大于hbase.hstore.blockingStoreFiles(7)),太多了则会先进行compact,并将flush推迟,而flush推迟的过程中(重新加入队列),可能会导致其他memstore中写了很多的数据,则这台regionserver的 所有memstore的总占用内存大小超过最大内存值,regionserver会阻塞住此时的往memstore写/删除请求,等到memstore大小降下去后才会恢复。

在flush后都会检查是否需要split和compact.

在put完成之后,会检查region总memestore size是否大于hbase.hregion.memstore.flush.size(64MB),若是,则执行一次flush.



Flush时可读可写。

注意hbase.hregion.memstore.flush.size的level是HRegion,也就是说当HRegion的总memstore大小大于此值时,会flush.

Flush和compact,split都是region level的,也就是说如果触发,将在一个region范围内进行,当然触发前提条件不一样。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值