基于ES的HBase二级索引方案

HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求。由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳海量数据等特点,结合ES的快速建立索引和提供多样化的查询接口等优势,构建基于ES的HBase二级索引方案。从HBase二级索引现状可知,目前主要解决思路分为两种:第一种是开发人员手动创建和维护索引表,该种方案开发难度大,维护困难,数据与索引同步更新困难。第二种是使用HBase引进的协处理器机制,借助其他强大的搜索引擎来共同完成。HBase的协处理器机制,提供各种钩子函数,可以监视HBase的相关操作。通过在钩子函数中部署业务代码,借助类似于关系型数据库的回调方式来触发,自动完成ES对HBase数据建立和维护索引的操作。本文沿用第二种方案。简述其基本原理:基于RowKey的查询,具有很高的检索效率,响应时间在毫秒别。因此,针对主键以外的某些字段建立类似Key-Value对的数据格式。将列值作为Key,以该列值对应的主键作为Value,并且对Key值建立索引,利用B+树或者其他查找高效的数据结构来存储,比如本文采用倒排索引结构,从而建立列值和主键的关联映射。

整体架构如图3.2所示:

基于ES的HBase二级索引方案_第1张图片

 

HBase所存储的数据的索引全都存储在ES中,实现数据与索引的分离。可以避免在HBase中再去手动创建和维护索引表。数据与索引的分离,带来两个问题:关联问题和同步问题。本文借鉴关系型数据库的外键关联的思想,ES的索引是面向文档的,文档ID唯一标识一条文档。HBase中主键RowKey唯一标识一条记录。因此,本文将两者设置为相同,从而解决HBases数据与ES索引的关联问题。

HBase的Observer需要监测HBase的插入和更新操作:将相应的业务逻辑代码部署到Put和Delete等钩子函数中,当发生Put操作时,将Put数据转化为JSON格式,索引到Elasticsearch中,并将RowKey和ES的文档ID建立关联。当发生Delete操作时,获取Delete数据的RowKey,删除ElasticSearch中对应ID的document记录,从而完成同步。考虑到未来HBase的写入会比较频繁,Put操作性能太低,借助ES的缓冲机制Bulk,用户的提交的数据积累到某个阈值时才进行批量操作,降低网络I/O负载,提高建引的效率。数据和索引的同步一致性问题,是本方案最为重要的一个环节。HBase为了加快写入速度,通常会将数据先缓存到内存的MemStore(写入缓冲区),当达到一定的阈值时,进行flush操作刷新到磁盘,永久持久化到HFile文件中,存入到HDFS。

转载自:基于Elasticsearch的地名和POI数据检索系统的设计与实现

你可能感兴趣的:(hbase)