共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。
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 操作