HBase Compaction
1.Compaction作用
- 合并小文件,减少文件数,稳定随机读延迟
- 提高数据的本地化率
- 清除无效数据,减少数据存储量
HFile越多,查询需要的IO操作也会变多,读延迟越来越大。Compaction稳定HFile文件个数,减少IO操作。本地化率越高,hdfs上访问数据时延迟就越小,本地化率低,访问数据就需要通过网络访问,延迟必然增大,Compaction后会将大文件在当前DataNode上保留一个副本,提高本地化率。Major Compaction可以将当前region的本地化率提高到100%
Compaction的副作用
- 带宽压力和短时间的IO压力,小文件读取需要IO,传输需要带宽。
- 读取后写新的文件需要有3个副本
2.Compaction组成
从一个Region上的一个Store中选取部分HFile文件进行合并,从这些待合并的文件中一次读取出KeyValue,再由小到大排序后写入一个新的文件,由这个新的文件对外提供服务
Minor Compaction
- 选取部分小的、相邻的HFile合并成一个HFile,形成一个更大的HFile(TTL过期数据也会被清理)
Major Compaction
- 将一个Store中所有HFile合并成一个HFile,会清理被删除的数据、TTL过期数据、版本号超过设定版本号的数据
- Major Compaction持续时间较长,消耗大量系统资源,影响大
- 生产推荐关闭自动触发的Major Compaction,在业务低峰期手动触发
3.Compaction基本流程
- 先完成flush操作(后续补充)、周期性的Compaction检查操作都会触发Compaction
- 选择合适的HFile合并
- 挑选合适的线程池
- 执行HFile文件合并
Compaction由独立的线程处理,该线程会从对应的store中选择合适的HFile进行合并,选文件有许多条件。理想情况是选取那些IO负载中、文件小的文件集
4.Compaction触发时机
MemStore Flush
MemStore Flush产生HFile文件,数据不断写入,就会有更多的HFile文件产生,每次flush完后都会对当前store中的hfile数量进行判断
一旦总文件数大于 hbase.hstore.compactionThreshold,就会触发compaction
compaction都是以store为单位,flush触发条件下,整个region的store都会执行compact操作
一个region可能在短时间内执行多次compaction(这是非常不好的现象)
后台线程定期检查
- 默认7天左右一次major compaction,关闭需将参数 hbase.hregion.majorcompection=0
手动触发
- 避免major compaction影响业务的读写性能或是硬盘容量不够。低峰期手动执行major compaction(我们的业务就是采用的这种方式)
5.HFile集合选取策略
- 排除正在Compaction的文件以及比这些文件更新的文件
- 排除某些过大的文件,大文件会产生大量IO
- 经过1 2 留下来的文件就是Compaction的候选文件
判断是否满足major compaction的条件,只要满足一下任意一条就会执行major compaction,对全部文件进行合并
- 用户强制执行major compaction
- 长时间没有进行major compaction且候选文件数小于10
长时间 = 上次执行major compaction的时间早于当前时间-hbase.hregion.majorcompection
- Store中含有reference文件,reference是region分裂产生的临时文件,在compaction过程中必须清理
若满以上任意一条件,文件选择就结束了,直接合并。若不满足,则为minor compaction。
minor compaction的文件选取策略:
- RatioBasedCompactionPolicy(从老到新选取文件)
- ExploringCompactionPolicy(选取到合适的文件后就停止选取,减少IO操作)
6.挑选合适的线程池
CompactSplitThread类负责接收compaction请求和split请求。
不同线程池如下: largeCompations 处理大compaction smallCompations 处理下小compaction splits 处理所有split请求
将请求独立处理,提高系统处理性能。根据阈值来决定是否为大或小compaction
7.HFile文件合并执行
- 选出了待合并的HFile和合适的处理线程,执行合并流程
- 读取待合并HFile的keyValue,进行归并排序,写到./tmp目录下的临时文件中
- 将临时文件移动到对应的store目录中
- 将Compaction的输入文件路径和输出文件封装为kv写入hlog日志中,打上compaction标记,强制执行sync
- 将对应Store数据目录下的Compaction输入文件全部删除
至此完成了一次Compaction操作
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。