问题描述

  1. CM告警,Compaction队列过多,有的超过了2000

  2. 分析日志发现有很多HFile很大所以合并的非常慢,如下面的日志合并耗时1小时多,合并出来大小为11.6G ``` 2020-12-10 07:45:08,189 INFO org.apache.hadoop.hbase.regionserver.HStore: Completed compaction of 10 file(s) in info of a01f3ffcf99e3a3f29817d8fa9df63df into 3f2860d5d6944ea3b37009c2cccdee7c(size=11.3 G), total size for store is 11.6 G. This selection was in queue for 0sec, and took 1hrs, 21mins, 48sec to execute.

```

问题分析

  1. 目前业务中都是使用BulkLoad的方式进行导入数据,BulkLoad直接生成HFile移动到自己对应的Rgion中,而不经过MemStore

  2. HBase中专门有两个线程池来执行Compaction操作,两个线程池默认都是1

image.png

  1. 使用哪个线程池是由hbase.regionserver.thread.compaction.throttle参数来决定,该参数计算方式为2 hbase.hstore.compaction.max hbase.hregion.memstore.flush.size = 2.5G

image.png

  1. 如果Compaction文件的大小大于2.5G那么进入大Compaction线程池,反之进入小Compaction线程池

  2. 小Compaction线程池我们配置的是5 ,大Compaction线程池没有配置,所以取默认值1,这两个参数设置一般不建议超过集群磁盘数量的一半

  3. 集群BulkLoad生成的HFile普遍很大,所以都会进入大Compaction队列,大Compaction队列只有一个线程,所以合并的非常慢,阻塞后面的Compaction请求

问题解决

  1. 设置参数hbase.regionserver.thread.compaction.large为5


相关参考

  1. https://my.cloudera.com/knowledge/HBase-Compaction-Queue-Does-Not-Lower—Files?id=74496