HBase原理 | HBase Compaction介绍与参数调优

2020-05-29 21:55:58 浏览数 (1)

我们知道,数据达到HBase服务端会写WAL-写Memstore,然后定期或满足一定条件时刷写磁盘生成一个HFile文件,随着时间推移生成的HFile会越来越多,将会影响HBase查询性能,同时会对HDFS造成一定影响。因此HBase会定期执行Compaction操作以合并减少HFile数量。

1.两种合并

HBase中Compaction分为两种。Minor Compaction称为小合并,主要是选取一些小的、相邻的HFile将他们合并成较大的HFile,并删除HFile中的过期数据。

Major Compaction称为大合并,会将一个列族下的所有HFile合并成一个大的HFile,同时删除过期数据、已删除数据(打了Delete标记的)、版本过大的数据等三类无效数据。

2. 参数调优

1).hbase.hstore.compaction.min

默认值 3,一个列族下的HFile数量超过该值就会触发Minor Compaction,这个参数默认值小了,一般情况下建议调大到5~10之间,注意相应调整下一个参数。(旧版本中该参数是hbase.hstore.compactionthreshold)

2).hbase.hstore.compaction.max

默认值 10,一次Minor Compaction最多合并的HFile文件数量,这个参数基本控制着一次压缩即Compaction的耗时。这个参数要比上一个参数hbase.hstore.compaction.min值大,通常是其2~3倍。

3).hbase.regionserver.thread.compaction.throttle

HBase RS内部设计了两个线程池:large compactions与small compactions,用来分开处理Compaction操作,这个参数就是控制一个Compaction应该交由哪一个线程池处理,默认值2 * hbase.hstore.compaction.max * hbase.hregion.memstore.flush.size,即2*10*128M=2.5G,如果待合并文件的总大小大于该值则交给large compactions线程池处理,否则交给small compactions线程池处理。一般建议不调整或稍微调大。

4).hbase.regionserver.thread.compaction.small

默认值 1,RS中small compactions线程池的大小。一般建议调整到2~5,不建议调太大,否则可能会消费过多的服务端资源得不偿失。

5).hbase.regionserver.thread.compaction.large

默认值 1,RS中large compactions线程池的大小。调整建议同上。

6).hbase.hstore.blockingStoreFiles

默认值 10,一个列族下HFile数量达到该值就会阻塞写入,等待Compaction完成。生产环境中默认值太小了,一般建议设置大点比如100,避免出现阻塞更新的情况。

7).hbase.hregion.majorcompaction

默认值 604800000,就是7天,这是Major Compaction周期性触发的时间间隔。因为通常Major Compaction持续时间长、资源消耗大,建议关闭HBase Major Compaction,参数设为0,并在业务低峰期手动执行。

微信扫一扫,关注我微信扫一扫,关注我

0 人点赞