MST
星途 面试题库

面试题:Hbase中HBase Compaction基本流程涉及哪些关键步骤及资源分配特点

请阐述HBase Compaction基本流程里从触发到完成过程中,涉及到哪些主要步骤,并且说明在这些步骤中,系统资源(如内存、磁盘I/O等)是如何分配与使用的。
10.5万 热度难度
数据库Hbase

知识考点

AI 面试

面试题答案

一键面试

触发阶段

  1. 触发条件
    • 小文件过多:当HBase的MemStore刷写生成大量小的HFile时,会触发Compaction。HBase通过配置参数(如hbase.hstore.compactionThreshold)来判断是否达到触发条件,默认值为3,即当一个Store下HFile数量达到3个时,可能触发Minor Compaction。
    • 时间触发:HBase也支持按时间周期触发Compaction,具体通过配置hbase.hstore.compaction.max.size等参数控制,当HFile大小总和超过该值时,也可能触发。
    • 大合并触发:Major Compaction会将一个Store下的所有HFile合并为一个HFile,可通过手动触发或按配置的时间周期(默认7天)触发。

准备阶段

  1. 文件选择
    • Minor Compaction:从当前Store的HFile集合中选择要合并的HFile。通常选择较新的、较小的HFile,以优化读取性能。这个选择过程依赖于HFile的元数据,如时间戳、文件大小等信息。
    • Major Compaction:选择当前Store下的所有HFile进行合并。
  2. 资源准备
    • 内存:为合并操作分配一定的内存空间,用于缓存合并过程中的数据。例如,会使用hbase.regionserver.global.memstore.size配置的部分内存来存储合并过程中的中间数据。这个内存空间用于存储从HFile中读取的数据,以及生成新HFile时的临时数据。
    • 磁盘I/O:确定合并后的新HFile存储位置,确保目标磁盘有足够的空间。

合并阶段

  1. 数据读取
    • 从选定的HFile中读取数据。由于HFile是基于LSM - Tree结构存储的,数据以KeyValue对形式存储。读取过程会按顺序遍历HFile,根据HBase的存储格式解析KeyValue对。这会产生较多的磁盘I/O操作,因为需要从多个HFile中读取数据。
  2. 数据合并
    • 将读取到的KeyValue对按RowKey排序(如果是不同版本的数据,还会按时间戳排序)。排序操作可能在内存中进行,对于大数据量可能需要借助外部排序算法,这会占用较多内存。在内存中排序完成后,将有序的KeyValue对写入新的HFile。
    • 在写入新HFile过程中,会不断进行磁盘I/O操作,将内存中的数据持久化到磁盘。写入操作采用追加写的方式,减少磁盘随机I/O,提高写入效率。

完成阶段

  1. 新HFile生成:新的HFile生成后,会更新HBase的元数据(如.META.表),记录新HFile的位置、大小等信息。
  2. 旧HFile清理
    • Minor Compaction:清理合并过程中使用的旧HFile,释放磁盘空间。这个过程会涉及到文件系统的删除操作,产生一定的磁盘I/O。
    • Major Compaction:同样清理所有参与合并的旧HFile。同时,Major Compaction还会处理墓碑(Tombstone)数据,即删除标记的数据,确保数据的一致性。

在整个HBase Compaction过程中,内存主要用于数据缓存、排序等操作,磁盘I/O则主要用于数据的读取和写入,包括HFile的读取、新HFile的写入以及旧HFile的清理等操作。合理配置内存和磁盘资源,对于优化HBase Compaction性能至关重要。