深入浅出系列Hbase之memstore flush、compaction

Memstore Flush

介绍

    Memstore Flush深度解析请阅读:http://hbasefly.com/2016/03/23/hbase-memstore-flush/

触发条件

 memstore级别限制:

当region的任意一个store的memstore的size,达到hbase.hregion.memstore.flush.size(默认128M),会触发memstore flush操作

 region级别限制:

    当region所有的memstore的size和,达到hbase.hregion.memstore.block.multiplier * 
    hbase.hregion.memstore.flush.size= 128*4=512M
    会触发memstore flush,同时会阻塞所有的写入该store的写请求!
    继续对该region写请求,会抛错  region too busy exception异常。

regionserver级别限制:

1、当rs节点上所有的memstore的size和 ,超过低水位线阈值

hbase.regionserver内存大小
*
hbase.regionserver.global.memstore.size 
*
hbase.regionserver.global.memstore.size.lower.limit
=48G*0.45*0.91=19.656G,
rs强制执行flush。先flush memstore最大的region,再第二大的,
直到总的memstore大小下降到低水位线的阈值。

2、如果此时写入非常繁忙,导致总的memstore大小hbase.regionserver内存大小

*
hbase.regionserver.global.memstore.size = 21.6G
rs会阻塞写 读的请求,并强制flush,达到低水位阈值(安全阈值)


hbase.regionserver.global.memstore.size.lower.limit
《==》
hbase.regionserver.global.memstore.lowerLimit

Hlog级别限制:

当rs的hlog数量达到hbase.regionserver.max.logs  32  会选择最早的hlog的对应的一个或多个region进行flush。

定期级别限制:

hbase.regionserver.optionalcacheflushinterval 默认1h  为避免所有的memstore在同一个时间点进行flush导致的问题,
定期的flush其实会有一定的随机时间延时。
设置为0 就是禁用

手动级别限制:

flush 命令 可以封装脚本

总结:

    在生产上,唯独触发rs级别的限制导致flush,是属于灾难级别的,会阻塞所有落在该rs节点的读写请求,直到总的memstore大小降到低水位线,阻塞时间较长。

其他的级别限制,只会阻塞对应的region的读写请求,阻塞时间较短。

 

Compaction

有minor compaction 小合并和major compaction 大合并

每次flush操作都是将一个memstore数据写到HFile文件,所以hdfs上有很多的hfile文件。小文件多了对后面的读操作有影响,所以hbase会定时将hfile文件合并。

minor compaction 小合并: 选取部分小的相邻的hfile合并为一个更大的hfile
major compaction 大合并:将一个store的所有的hfile文件合并一个hfile。
这个过程【重之又重】:
    清理TTL过期数据
    版本号超过设定的数据会被清理(put)
    被删除的数据(delete)

所以 major compaction持续时间较长,整个过程消费大量的系统资源(带宽 和短时间的IO压力),对上层业务会有较大的影响!
所以生产上尽可能的避免发生major compaction,一般通过关闭自动触发大合并,改为手动触发,在业务低谷时期,执行。(一般在凌晨调度脚本,去执行)

 

我们要清楚为什么要合并?

    随着hflie文件越来越多,查询需要更多的IO,读取延迟较大。所以需要compaction,主要为了消费带宽和短时间的IO压力,来换取以后查询的低延迟。


合并作用:

    合并小文件  减少文件数量  减小稳定度的延迟,消除无效数据 降低存储空间,提高数据的本地化率

合并的触发条件:

  先判断是否触发小合并,再判断是否大合并
a.memstore flush:合并根源来自flush,当memstore达到阈值或者其他条件就触发flush,将数据写到hflie,正是因为文件多,才需要合并。
每次flush之后,就当前的store文件数进行校验判断,一旦store的总文件数超过hbase.hstore.compactionThreshold(默认3),就会触发合并

b.后台线程定期检查
后台线程compactchecker 定期检查是否需要执行合并。检查周期为
hbase.server.thread.wakefrequency*hbase.server.compactchecker.interval.multiplier=10000ms*1000。在不做参数修改情况的下,compactchecker 大概是2hr,46min,40s执行一次

当文件小于 hbase.hstore.compaction.min.size会被立即添加到合并的队列,当storefiles数量超过
hbase.hstore.compaction.min时,就小合并启动。

生产上:
hbase.hregion.majorcompaction      0  大合并关闭 
hbase.hstore.compactionThreshold   6(默认3) 小合并

 

下面是HBASE与zookeeper连接时需要的文件配置优化

    <!--ZooKeeper 会话超时。Hbase 把这个值传递改 zk 集群,向它推荐一个会话的最大超时时间 -->
    <property>
            <name>zookeeper.session.timeout</name>
            <value>120000</value>
    </property>

    <!--当 regionserver 遇到 ZooKeeper session expired , regionserver 将选择 restart 而不是 abort -->
    <property>
            <name>hbase.regionserver.restart.on.zk.expire</name>
            <value>true</value>
    </property>

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章