关于hadoop:HBase中MemStore的刷写触发机制

42次阅读

共计 1788 个字符,预计需要花费 5 分钟才能阅读完成。

因为 HBase 的数据存储应用的是 HDFS,而 HDFS 是不反对随机读写的,所以 HBase 的数据写入采纳 LSM 算法。LSM 算法个别会分内存和磁盘两局部存放数据,在 HBase 的实现中,内存局部称作 MemStore,采纳的是跳跃表实现,保护了一个有序的 KeyValue 汇合,磁盘局部有 0 到多个外部 KeyValue 有序的 HFile 文件组成。这些 HFile 文件,就是一些机制的触发下,将内存中 MemStore 数据刷写到磁盘造成的(其中,有些 HFile 文件是通过一些小的 HFile 文件采纳多路归并算法合并造成)。

如上图,一台 RegionServer 服务器上会治理着多个 Region,一个 Region 中可能会有 1 到多个列族。在存储上,一个列族对应一个 Store,而一个 Store 就包含了 LSM 中提到的 MemStore 和 StoreFile(即 HFile)两局部。须要留神的是:刷写的最小执行单元是 Region 而不是单个 MemStore。如果一个 HRegion 中 Memstore 过多,当执行 flush 时,有可能有些 MemStore 数据量占比很小,比方 k 级别,刷写的话也不会开释很多内存,却会产生很多小文件,这也是官网倡议大家设计表时列族不要太多的起因。

触发 MemStore 刷写的机制大略分为:人为手动触发、HBase 定时触发、HLog 数量限度触发,其余事件触发(Compact、Split、Truncate 等)、内存限度触发。其中内存限度触发细分为:MemStore 级别限度触发、Region 级别限度触发、RegionServer 级别限度触发。

  • 人为手动触发
  • 通过 shell 命令 flush 'tablename' 或者 flush‘regionname’ 别离对整表所有 region 和具体一个 Region 进行 flush。
  • HBase 定时触发
  • HBase 提供主动刷写机制,达到主动刷写的工夫,也会触发 MemStore flush。主动刷新的工夫距离由 hbase.regionserver.optionalcacheflushinterval(默认 1 小时) 指定。须要留神的是,该机制解决是整个集群所有表的所有 region,对生产读写,以及 HDFS 小文件等都有不利影响。如果设定为 0,则敞开定时主动刷写。
  • HLog 数量限度触发
  • 当 WAL 文件的数量超过hbase.regionserver.maxlogs,region 会依照工夫程序顺次进行刷写,直到 WAL 文件数量减小到该参数值以下(该属性名曾经废除,现无需手动设置,最大值为 32)。
  • 其余事件触发
  • 在执行 Region 的合并、决裂、快照以及 HFile 的 Compact 等前会执行刷写。
  • MemStore 级别内存限度触发
  • 当某个 Region 中任意一个 MemStore 达到 hbase.hregion.memstore.flush.size 参数值大小,就会触发该 Region 的刷写。
  • Region 级别内存限度触发
  • 当某个 Region 中所有 MemStore 的大小加和达到了hbase.hregion.memstore.block.multiplier*hbase.hregion.memstore.flush.size 值大小,就会触发该 Region 的刷写。此时会阻塞入该 Region 的写申请,如果往 MemStore 写数据,会呈现 RegionTooBusyException 异样。
  • RegionServer 级别内存限度触发
  • 当某 RegionServer 种所有 MemStore 的大小加和达到了 RegionServer 全局低水位阈值java_heapsize *hbase.regionserver.global.memstore.size*hbase.regionserver.global.memstore.size.lower.limit 值大小,RegionServer 会强制执行刷写,按序抉择 Region 所有蕴含 MemStore 大小加和大的 Region 执行。于此相干的,如果此时数据写入吞吐量仍然很大,导致该 RegionServer 种所有 MemStore 的大小加和超过该 RegionServer 全局水位阈值java_heapsize * hbase.regionserver.global.memstore.size 值大小,RegionServer 会阻塞写申请,直到 MemStore 刷写大小将到低水位阈值。
正文完
 0