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>