基于Solr实现HBase的二级索引

HBase 二级索引方案的基本原理

本文所说的二级索引是针对 HBase 数据表中的 rowkey 一级索引而言的,其原理就是针对数据表主键(rowkey)外的某个或者某些字段列建立的类似于“键 - 值”对的数据结构,以列的值作为“键”,以该列值对应的 rowkey 作为“值”,并按“键”的值进行排序,利用B+ 树或者其他查找效率高的数据结构进行存储,以建立“列值”到 row key 的映射关系。如果查询条件中的字段都建立了二级索引,则可以根据字段值在二级索引中快速找到对应的 row key 集,然后对多个字段查找到的 row key 集按照查询条件进行合并,得到满足查询条件的 row key 集,最后则可以根据 row key 在HBase中快速检索出需要的其他字段值。

Hindex 二级索引方案

在 HBase 0.92 版本引入了 Coprocessor 框架后,利用Coprocessor 创建 HBase数据表的二级索引成为了研究的热点。下面通过详细介绍华为的hindex二级索引方案来分析 Coprocessor的具体工作原理,为本文的二级索引方案提供参考依据,并作为本文二级索引方案实验的比较对象。hindex的整体架构如图 1 所示。

hindex 在保持 HBase原有结构的情况下,对其功能进行了部分扩展,扩展内容主要包括 Client Ext、Balancer 和 Indexing Coprocessor 等 3部分。Client Ext 对 HBase 客户端的功能进行了扩展,提供了创建二级索引的 API 接口,用户可以通过这些扩展的 API 来设定索引创建的细节,如在哪些表的哪些列中创建二级索引 ;实现可自定义的均衡器,可根据当前二级索引的创建和存储情况进行负载均衡 ;实现了Indexing Coprocessor 来自动创建和管理具体的二级索引数据。

在创建带二级索引的数据表时,Balancer 会根据HBase 系统当前的负载情况为新建的数据表分配Region。同时,hindex会自动在同一个 RegionServer上创建与该数据表对应的索引表。

1.3 基于 Solr 的 HBase 二级索引方案 SIHBase

本文采用优势互补的思想,将HBase强大的存储能力和 Solr的快速检索能力通过HBase 的 Coprocessor框架结合起来,以实现对海量数据的快速检索,其整体架构如图 2所示。

本方案保留了HBase原有的架构,对HBase 客户端进行功能扩展,添加了在Solr中创建和维护二级索引的协处理器,集成了 Solr 并实现了数据存储与索引的分离。

Client Ext中扩展的功能主要包括定义需要建立二级索引的列和实现直接对Solr中创建的索引进行条件查询。

Solr Indexing Coprocessor主要负责数据表修改和删除,以及表中索引列数据插入、更新和删除等情况下,同步更改Solr中的二级索引数据,并且在HRegionServer宕机和系统进行数据恢复时保证Solr二级索引和HBase表中数据的一致性。Solr主要用于存储和管理HBase的二级索引,并提供高效的检索服务。

1)数据表与二级索引的设计

在用户设计HBase数据表时需要考虑为表中的哪些列建立二级索引,为了管理和维护的方便,本方案修改了 HBase 的 HTableDescriptor 类,该类保存了HBase数据表的相关信息,如表名、列族等,本方案在该类中添加了一个类型为Map<ImmutableBytesWritable,ImmutableBytesWritable> 的 secondIndexs 变 量, 该变 量 以 KeyValue的形式保存表中创建的二级索引列(Key)及其在Solr 的 Schema.xml文件中对应的Filed名字(Value),并提供了对应的addSecondIndexs()方 法、deleteSecondIndexs()、checkSecondIndexs()、clearSecondIndexs() 和getSecondIndexs()等方法。本方案推荐需要建立二级索引的列都以字符串“idx”作为列修饰符的前缀,以便识别哪些列上创建了二级索引。

在 HBase数据表设计完成之后,需要修改Solr 的Schema.xml配置文件。将HBase 的 row key 作为 Schema.xml 中的 uniqueKey,用于唯一标识HBase数据表中的一行记录,此时HBase一行记录即为Solr中的一个Document。在索引阶段,Solr 只需向 HBase返回满足条件的 row key 集合即可。另外,还需要将HBase数据表中需要建立二级索引的列以Filed的形式添加到Schema.xml 文件中作为 Solr 索引的一个域。

2)二级索引的插入与更新

由于在 HBase中进行数据更新和Solr中进行索引更新都是通过数据的插入操作完成的,所以可以将二级索引的更新操作合并到插入操作进行分析设计。HBase中是通过客户端的HTable.put()操作向表中插入数据的,因此只需要继承HBase协处理器框架中的 BaseRegionObserver 类,并实现其中的prePut() 或者 postPut()方法就可以实现在HBase插入数据时同步向 Solr写入索引数据的钩子函数。本方案实现了BaseRegionObserver 的子类 SolrIndexingObserver,在该子类中实现了postPut()的方法,在HTable.put()执行之后,向 Solr中写入二级索引数据,数据的插入过程过程如图 3所示。

如果二级索引写入不成功,出现异常,则需要用户在处理异常后重新再写入一次数据,以保证Solr 中存储的二级索引和 HBase 表中数据的一致性。

3)二级索引的删除

SIHBase中删除二级索引是由多种情况导致的,涉及到表级操作而导致二级索引被删除的情况包括 HBase 表中列的删除、二级索引列的撤销以及表的删除等情况。另外,HBase在删除数据时也会导致二级索引的同步删除。如果按照 row key 删除数据,这与二级索引的插入过程十分类似,有所不同的是HBase 使用 Put类存储插入时的相关信息,而使用 Delete类存储删除时的相关信息。因此,在这种情况下也需要对Delete 类进行扩展,添加secondIndexs变量用于存储哪些列建立了二级索引及其在Solr 中对应的Filed 名,并添加相应的add() 和 get()方法来修改和获取secondIndexs变量内容。然后在SolrIndexingObserver 中实现 preDelete()钩子函数的相关功能,调用Solrj 的 API 函数 deleteById() 通过 rowkey可以删除二级索引,具体过程如图 4 所示。

4)二级索引检索

SIHBase 进行条件查询的过程如图 5 所示。

用户通过Solrj 提供的 API 可以在 Solr中进行多条件的复杂查询,并快速得到查询结果。由于Solr 中的 Filed可以选择是否存储,如果查询条件中需要的结果已经存储在 Solr中,则可以直接向用户返回其需要的结果 ;如果没有存储,则会向用户返回该Filed值对应的Document ID,Document ID存储的是HBase 对应的 row key,用户获取到满足条件的 row key 集合后通过Table.get()的方式按 rowkey 在 HBase 查询需要的数据。

转载自:一种基于Solr的HBase海量数据二级索引方案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值