也可以通过 Java 的 timer schedule,在实际项目中使用 Quartz 来启动,启动的时间配置在配置文件中给出,可以方便的修改 Major Compact 启动的时间。通过这种修改后,我们发现在删除数据后仍会有 Compact 操作。这样流程进入 needsCompaction = true 的分支。查看 needsCompaction 判断条件为 (storefiles.size() – filesCompacting.size()) > minFilesToCompact 触发。同时当需紧缩的文件数等于 Store 的所有文件数,Minor Compact 自动升级为 Major Compact。但是 Compact 操作不能禁止,因为这样会导致数据一直存在,最终影响查询效率。
基于以上分析,我们必须重新考虑删除数据的流程。对用户来说,用户只要在检索时对于删除的任务不进行检索即可。那么只需要删除该条任务记录,对于该任务相关联的数据不需要立马进行删除。当系统空闲时候再去定时删除 HBase 数据表中的数据,并对 Region 做 Major Compact,清理已经删除的数据。通过对任务删除流程的修改,达到项目的需求,同时这种修改也不需要修改 HBase 的配置。

图 4. 数据删除流程对比图(查看大图)
检索、查询、删除 HBase 数据表中的数据本身存在大量的关联性,需要查看 HBase 数据表的源代码才能确定导致检索性能瓶颈的根本原因及最终解决方案。
结束语
HBase 数据库的使用及检索优化方式均与传统关系型数据库存在较多不同,本文从数据表的基本定义方式出发,通过 HBase 自身提供的 API 访问方式入手,举例说明优化方式及注意事项,最后通过实例来验证优化方案可行性。检索性能本身是数据表设计、程序设计、逻辑设计等的结合产物,需要程序员深入理解后才能做出正确的优化方案。