HBase第五天——HBase 三个重要机制
自己的话:我愿平东海,身沉心不改;
大海无平期,我心无绝时。
HBase的数据flush、compact、split机制
一、数据 flush 过程(flush)
- 当 MemStore 数据达到阈值(默认是 128M,老版本是 64M),将数据刷到硬盘,将内存中的数据删除,同时删除 HLog 中的历史数据;
- 并将数据存储到 HDFS 中;
- 在 HLog 中做标记点。
二、数据合并过程(compact)
- 当数据块达到 4 块,Hmaster 触发合并操作,Region 将数据块加载到本地,进行合并;
- 当合并的数据超过 256M,进行拆分,将拆分后的 Region 分配给不同的 HregionServer
管理; - 当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer
加载,修改.META.; - 注意:HLog 会同步到 HDFS。
三、数据拆分过程(split)
当Region达到阈值,会把过大的Region一分为二。
默认一个HFile达到10Gb的时候就会进行切分
四、flush详解
因为对flush机制中部分过程不太理解,所以探究了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的时候就会 对这些文件进行合并重写为一个新文件,设置个数越大可以减少触发合并的时间,但是每次合并的时间就会越长
让优秀成为习惯