HBase三个重要机制

1、flush机制

1)hbase.regionserver.global.memstore.size】默认;堆大小的40%

RegionServer的全局Memstore的大小,超过该大小会触发flush到磁盘的操作,默认是堆大小的40%,
而且RegionServer级别的flush会阻塞客户端读写

2)hbase.hregion.memstore.flush.size】默认:128M

单个region里memstore的缓存大小,超过那么整个HRegion就会flush, 

3)hbase.regionserver.optionalcacheflushinterval】默认:1h

内存中的文件在自动刷新之前能够存活的最长时间

4)hbase.regionserver.global.memstore.size.lower.limit】默认:堆大小 * 0.4 * 0.95

有时候集群的“写负载”非常高,写入量一直超过flush的量,这时,我们就希望memstore不要超过一定的安全设置。
在这种情况下,写操作就要被阻塞一直到memstore恢复到一个“可管理”的大小, 这个大小
就是默认值是堆大小 * 0.4 * 0.95,也就是当regionserver级别的flush操作发送后,会阻塞客户端写,
一直阻塞到整个regionserver级别的memstore的大小为 堆大小 * 0.4 *0.95为止

5)hbase.hregion.preclose.flush.size】默认为:5M

当一个 region 中的 memstore 的大小大于这个值的时候,我们又触发 了 close.会先运行“pre-flush”操作,
清理这个需要关闭的memstore,然后 将这个 region 下线。当一个 region 下线了,我们无法再进行
任何写操作。 如果一个 memstore 很大的时候,flush  操作会消耗很多时间。"pre-flush" 操作
意味着在 region 下线之前,会先把 memstore 清空。这样在最终执行 close 操作的时候,flush 操作会很快

6)hbase.hstore.compactionThreshold】默认:超过3个

一个store里面允许存的hfile的个数,超过这个个数会被写到新的一个hfile里面 也即是每个region的每个列族
对应的memstore在fulsh为hfile的时候,默认情况下当超过3个hfile的时候就会 对这些文件进行合并
重写为一个新文件,设置个数越大可以减少触发合并的时间,但是每次合并的时间就会越长

2、compact机制

1) 概述:在Hbase中每当有Memstore数据flush到磁盘之后,就形成一个StoreFile,当StoreFile 的数量达到一定程度后(默认3个),就需要将Storefile 文件来进行compaction操作

2) Compact 的作用:
2.1、合并文件
2.2、清除过期,多余版本的数据
3.3、提高读写数据的效率

3) HBase 中实现了两种compaction 的方式:Minor compaction和 Major compaction
这两种compaction方式的区别是:
3.1、Minor compaction 操作只用来做部分文件的合并操作以及包括minVersion=0 并且设置TTL的过
期版本清理,不做任何删除数据、多版本数据的清理工作
3.2、Major compaction 操作是对Region 下的HStore 下的所有StoreFile 执行合并操作,最终的结果
是整理合并出一个文件,会清理掉过期数据以及将delete标记删除,delete标记在此之前会一直存在

4) 相关扩展知识
4.1、flush '表名' 手动刷新memStore到storefile
4.2、compact '表名' 手动合并,合并成一个文件
4.3、flush 时会删除数据
flush时会将内存中不在版本范围内的数据全部删掉,然后再持久化到形成一个storeFile文件,然后后续的数据会写入一个新的storefile文件
4.3、scan ‘abc’,{RAW=>true,VERSIONS=>5} 查看的是内存+本地的数据,根据时间戳排序进行显示

3、split机制(引用自 https://www.jianshu.com/p/53459997c814)

1) 概述:
Hbase Split 是一个很重要的功能,HBase 通过把数据分配到一定数量的 Region 来达到负载均衡的。当 Region 管理的数据过多时,可以通过手动或自动的方式触发 HBase Split 将一个 Region 分裂成两个新的子 Region,并对父 Region 进行清除处理(不会立即清除)
2) Split 触发时机:
HBase 中共有3种情况会触发 HBase Split:
2.1、当 Memstore flush 操作后,HRegion 写入新的 HFile,有可能产生较大的 HFile,会判断是否需要执行 Split
2.2、HStore 执行完成 Compact 操作后可能产生较大的 HFile,会判断是否需要执行 Split
2.3、HBaseAdmin 手动执行 split 命令时,会触发 Split

3) 注意事项
3.1、不能对元数据表进行 Split
3.2、不能对正在恢复的 Region 进行 Split
3.3、如果某个 Region 存在引用文件的不能 Split
3.4、当 Split 执行到将父 Region 下线之后,子 Region还未创建之前,如果此刻正访问的是父 Region,在客户端没有更新 Region 地址缓存的情况下,会报 NotServingRegionException 异常,因此客户端需要做好重试机制
3.5、Split 的完整过程中有个关键的时间点是无法回退的点(PONR: point of no return),发生在将 .META. 表中的父 Region 下线之前,如果进入 PONR 之后,由于种种原因更新 .META. 失败,需要重启所在的 RegionServer

更多 Split详解 请点击

发布了52 篇原创文章 · 获赞 282 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_43733123/article/details/103626337