HBase 入门之数据刷写(Memstore Flush)详细说明

本文介绍了HBase中MemStore刷写的过程和触发条件,包括内存阈值、WAL数量、定期刷写和手动触发等。当MemStore内存超过特定阈值或RegionServer内存总和过大时,会触发刷写。此外,WAL数量过多、定期自动刷写以及数据更新数量达到阈值也会导致刷写。文章还讨论了不同刷写策略,如FlushAllStoresPolicy、FlushAllLargeStoresPolicy和FlushNonSloppyStoresFirstPolicy,以及刷写过程的几个阶段:prepareFlush、flushCache和commit。
摘要由CSDN通过智能技术生成

本文涉及到很多参数,如微信阅读不友好,可访问 https://www.iteblog.com/archives/2497.html (点击下面 阅读原文 即可进入)原文进行阅读。

接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系)。HBase 写数据(比如 put、delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写到一个称为 MemStore 的内存结构里面的,如下图:

640?wx_fmt=png如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

但是,MemStore 毕竟是内存里面的数据结构,写到这里面的数据最终还是需要持久化到磁盘的,生成 HFile。如下图:

640?wx_fmt=png

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop


理解 MemStore 的刷写对优化 MemStore 有很重要的意义,大部分人遇到的性能问题都是写操作被阻塞(Block)了,无法写入HBase。本文基于 HBase 2.0.2,并对 MemStore 的 Flush 进行说明,包括哪几种条件会触发 Memstore Flush 及目前常见的刷写策略(FlushPolicy)。

什么时候触发 MemStore Flush

有很多情况会触发 MemStore 的 Flush 操作,所以我们最好需要了解每种情况在什么时候触发 Memstore Flush。总的来说,主要有以下几种情况会触发 Memstore Flush:

  1. Region 中所有 MemStore 占用的内存超过相关阈值

  2. 整个 RegionServer 的 MemStore 占用内存总和大于相关阈值

  3. WAL数量大于相关阈值

  4. 定期自动刷写

  5. 数据更新超过一定阈值

  6. 手动触发刷写

下面对这几种刷写进行简要说明。

Region 中所有 MemStore 占用的内存超过相关阈值

当一个 Region 中所有 MemStore 占用的内存(包括 OnHeap + OffHeap)大小超过刷写阈值的时候会触发一次刷写,这个阈值由 hbase.hregion.memstore.flush.size 参数控制,默认为128MB。我们每次调用 put、delete 等操作都会检查的这个条件的。

但是如果我们的数据增加得很快,达到了 hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier 的大小,hbase.hregion.memstore.block.multiplier 默认值为4,也就是128*4=512MB的时候,那么除了触发 MemStore 刷写之外,HBase 还会在刷写的时候同时阻塞所有写入该 Store 的写请求!这时候如果你往对应的 Store 写数据,会出现 RegionTooBusyException 异常。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值