Hbase的刷写、合并与分片

文章目录

    • 一、前言
    • 二、Hbase的刷写合并与分片
      • 1.刷写
        • MemStore 刷写时机
      • 2.合并
      • 3.分片
        • Region Split 时机

一、前言

​ 在上一次的Hbase的分享中我们主要了解了Hbase的系统结构、各组件、读写流程(HBase的系统结构与读写流程);在本次我们将继续深入了解Hbase的刷写与合并。下面进入正题。

二、Hbase的刷写合并与分片

1.刷写

Hbase的刷写、合并与分片_第1张图片
​ MemStore 的刷写也叫做Flush也有人称之为随机写,它是在经过客户端操作数据存储在MemStore 之后,当满足一些特定条件时,将MemStore 中的数据转换成storefile(Hfile)存储到文件系统(磁盘)的过程。

MemStore 刷写时机

以下选项均可以在hbase-site.xml的文件中进行配置。

1:).当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size (默认值 128M ),
其所在 region 的所有 memstore 都会刷写。当 memstore 的大小达到了

hbase.hregion.memstore.flush.size (默认值 128M )* hbase.hregion.memstore.block.multiplier (默认值 4 )时

会阻止继续往该 memstore 写数据。

2:).当 region server 中 memstore 的总大小达到

 java_heapsize * hbase.regionserver.global.memstore.size (默认值 0.4 )
* hbase.regionserver.global.memstore.size.lower.limit (默认值 0.95 ),

region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server中所有 memstore 的总大小减小到上述值以下。当 region server 中 memstore 的总大小达到

java_heapsize * hbase.regionserver.global.memstore.size (默认值 0.4 )

时,会阻止继续往所有的 memstore 写数据。

3:).到达自动刷写的时间,也会触发 memstore flush。自动刷新的时间间隔由该属性进行
配置 hbase.regionserver.optionalcacheflushinterval (默认 1 小时)。

4:).当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次进
行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃,
现无需手动设置,最大值为 32,我在hbase1.3.1的配置文件中没有找到这个属性)。

2.合并

Hbase的刷写、合并与分片_第2张图片
​ hfile的合并官方称之为StoreFile Compaction。MemStore 的刷写每次都会形成一个新的Hfile文件,而且同一个字段的不同版本和不同类型有可能分布在不同的Hfile中。所以查询时会循环所有的hfile文件。为了减少小文件的个数,以及清理掉过期和删除的数据,要进行合并。

​ Compaction分为两种。一种是Minor Compaction,它会将多个hfile文件合并为一个大的hfile,但是不会清理过期和删除的数据(特殊情况:合并的hfile文件大于等于3个时,也会触发一次Major Compaction)。另一种是 Major Compaction,它会将一个Store下的所有hfile合并成一个大的hfile,并且会清理过期和删除的数据。

3.分片

Hbase的刷写、合并与分片_第3张图片
​ 分片也称之为Region Split。默认情况下,每个 Table 起初只有一个 Region,随着数据的不断写入,Region 会自动进行拆分。刚拆分时,两个子 Region 都位于当前的 Region Server,但处于负载均衡的考虑,
HMaster 有可能会将某个 Region 转移给其他的 Region Server。

Region Split 时机

  1. 当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize
    该 Region 就会进行拆分(0.94 版本之前)。
  2. 当 1 个 region 中 的某 个 Store 下所有 StoreFile 的总 大 小超过 Min(R^2 *
    "hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),hbase.hregion.max.filesize默认是10g;该 Region 就会进行拆分,其中 R 为当前 Region Server 中属于该 Table 的个数(0.94 版本之后)。**注意:**注意这里有个坑默认的这种情况有些时候可能引发region的数据倾斜,所以强烈建议建表时使用预分区操作。

你可能感兴趣的:(#,HBase)