问题描述
CM告警,Compaction队列过多,有的超过了2000
分析日志发现有很多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.
```
问题分析
目前业务中都是使用BulkLoad的方式进行导入数据,BulkLoad直接生成HFile移动到自己对应的Rgion中,而不经过MemStore
HBase中专门有两个线程池来执行Compaction操作,两个线程池默认都是1

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

如果Compaction文件的大小大于2.5G那么进入大Compaction线程池,反之进入小Compaction线程池
小Compaction线程池我们配置的是5 ,大Compaction线程池没有配置,所以取默认值1,这两个参数设置一般不建议超过集群磁盘数量的一半
集群BulkLoad生成的HFile普遍很大,所以都会进入大Compaction队列,大Compaction队列只有一个线程,所以合并的非常慢,阻塞后面的Compaction请求
问题解决
- 设置参数hbase.regionserver.thread.compaction.large为5
