HBase 数据库检索性能优化策略
作者:网络转载 发布时间:[ 2015/8/17 10:13:35 ] 推荐标签:测试开发技术 数据库
HBase 配置
建议 HBase 的服务器内存至少 32G,表 1 是通过实践检验得到的分配给各角色的内存建议值。
模块 服务种类 内存需求
HDFS HDFS NameNode 16GB
HDFS DataNode 2GB
HBase HMaster 2GB
HRegionServer 16GB
ZooKeeper ZooKeeper 4GB
表 1. HBase 相关服务配置信息

HBase 的单个 Region 大小建议设置大一些,推荐 2G,RegionServer 处理少量的大 Region 比大量的小 Region 更快。对于不重要的数据,在创建表时将其放在单独的列族内,并且设置其列族备份数为 2(默认是这样既保证了双备份,又可以节约空间,提高写性能,代价是高可用性比备份数为 3 的稍差,且读性能不如默认备份数的时候。
实际案例
项目要求可以删除存储在 HBase 数据表中的数据,数据在 HBase 中的 Rowkey 由任务 ID(数据由任务产生) 加上 16 位随机数组成,任务信息由单独一张表维护。图 2 所示是数据删除流程图。

图 2. 数据删除流程图
初的设计是在删除任务的同时按照任务 ID 删除该任务存储在 HBase 中的相应数据。但是 HBase 数据较多时会导致删除耗时较长,同时由于磁盘 I/O 较高,会导致数据读取、写入超时。
查看 HBase 日志发现删除数据时,HBase 在做 Major Compaction 操作。Major Compaction 操作的目的是合并文件,并清除删除、过期、多余版本的数据。Major Compaction 时 HBase 将合并 Region 中 StoreFile,该动作如果持续长时间会导致整个 Region 都不可读,终导致所有基于这些 Region 的查询超时。
如果想要解决 Major Compaction 问题,需要查看它的源代码。通过查看 HBase 源码发现 RegionServer 在启动时候,有个 CompactionChecker 线程在定期检测是否需要做 Compact。源代码如图 3 所示。

图 3. CompactionChecker 线程代码图
isMajorCompaction 中会根据 hbase.hregion.majorcompaction 参数来判断是否做 Major Compact。如果 hbase.hregion.majorcompaction 为 0,则返回 false。修改配置文件 hbase.hregion.majorcompaction 为 0,禁止 HBase 的定期 Major Compaction 机制,通过自定义的定时机制 (在凌晨 HBase 业务不繁忙时) 执行 Major 操作,这个定时可以是通过 Linux cron 定时启动脚本,也可以通过 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 访问方式入手,举例说明优化方式及注意事项,后通过实例来验证优化方案可行性。检索性能本身是数据表设计、程序设计、逻辑设计等的结合产物,需要程序员深入理解后才能做出正确的优化方案。

sales@spasvo.com