HBase二级索引的设计与应用

本文探讨了HBase多条件组合查询的局限性,并提出了通过设计二级索引来提高查询效率的方法。介绍了二级索引的构建思路及逻辑视图,详细说明了数据查询过程,以及在put、get和scanner操作中的应用。

 HBase的多条件组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKey中显然不太可能),或者全表扫描再结合过滤器筛选出目标数据(太低效),所以通过设计HBase的二级索引来解决这个问题。
查询需求多个查询条件构成了多维度的组合查询,需要根据不同组合查询出符合条件的数据。
HBase的局限性
HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的查询困难(如:对于价格+天数+酒店+交通的多条件组合查询困难),全表扫描效率低下。


二级索引的设计
 
(图1)设计思路

二级索引的本质就是建立各列值与行键之间的映射关系

       如(图1),当要对F:C1这列建立索引时,只需要建立F:C1各列值到其对应行键的映射关系,如C11->RK1等,这样就完成了对F:C1列值的二级索引的构建,当要查询符合F:C1=C11对应的F:C2的列值时(即根据C1=C11来查询C2的值,图1青色部分)
其查询步骤如下:
1. 根据C1=C11到索引数据中查找其对应的RK,查询得到其对应的RK=RK1
2. 得到RK1后就自然能根据RK1来查询C2的值了 这是构建二级索引大概思路,其他组合查询的联合索引的建立也类似。

逻辑视图

   (图2) 部分数据在HBase中存储的逻辑视图
      表中有两个列族,其中一个是列族INDEX,其并不存储任何的数据,仅仅是为了将索引数据与主数据分开存储(因为在HBase中同一列族的数据会被压缩在一起存储),索引数据的行键格式为:RegionStartKey-索引名-索引键-Rowkwy,其他RegionStartKey就是出发点,因为在创建HBase表时就对表根据出发点进行了预分区,索引键为主数据中某列(可能是多列)的列值,Rowkey对应主数据的行键;主数据的行键格式为:出发点-目的地-性价比,所以在存储数据时,同一出发点 目的地的数据默认是按性价比排序的;索引数据的行键和主数据的行键的前缀都是出发点,所以在存储时相同出发点的索引数据和主数据是存储在同一个Region中的,这样避免了在通过索引得到RK后又去其他Region上查询目标数据,提高了查询效率。

数据的查询过程
假设查询的条件:
        出发点:澳门
        目的地:杭州
        出游天数:3天
        酒店等级:4
其查询步骤如下:
    1、首先根据查询条件来确定索引名,根据其查询条件为出游天数据 酒店等级确定索引名为aaa,这样就将查询的范围缩小在索引名为aaa的索引数据区内
    2、根据出游天数的值为3天,酒店等级的值为4,结合Phoenix的模糊查询就能确定符合这两个查询条件的索引数据的行键
    3、得到索引数据行键后就截取其最后的RowKey
    4、最关键的Rowkey得到后就能轻易的获得其对应的列值了,整个查询过程就结束了。
对于其他更为复杂的组合查询的二级索引设计如类似。
    当用户put操作时,会将原rowkey,转换为新的rowkey,再存一份索引。
    当用户get操作时,会将rowkey映射为实际的rowkey,再根据实际的rowkey获取实际的结果。
    当用户执行scanner操作时,会将scanner的结果映射为实际rowkey的结果,返回给用户。
通过hbase的BaseRegionObserver 协处理器,可以封装处理很多hbase操作。

缺点
       需要额外的存储空间,属 一种以空间换时间的方式。
注意
1.将查询条件中的可选字段转换成数字能节省存储空间,如交通工具中的飞机,高铁,火车,轮船,汽车分别转换成5,4,3,2,1
2.将汉字转换成拼音才能保证数据按HBase的排序规则排序
3.如果数据量在百万级别以下可使用Phoenix(HBase的SQL查询引擎)模糊查询功能减少索引行键的设计

--------------------- 
原文:https://blog.youkuaiyun.com/BigData_Mining/article/details/82380834 

 

概述 在 Hbase 中,表的 RowKey 按照字典排序, Region 按照 RowKey 设置 split point 进行 shard, 通过这种方式实现的全局、分布式索引. 成为了其成功的最大的砝码。 然而单一的通过 RowKey 检索数据的方式,不再满足更多的需求,查询成为 Hbase 的瓶颈,人 们更加希望像 Sql 一样快速检索数据,可是,Hbase 之前定位的是大表的存储,要进行这样 的查询,往往是要通过类似 Hive、Pig 等系统进行全表的 MapReduce 计算,这种方式既浪费 了机器的计算资源,又因高延迟使得应用黯然失色。于是,针对 HBase Secondary Indexing 的方案出现了。 Solr Solr 是一个独立的企业级搜索应用服务器,是 Apache Lucene 项目的开源企业搜索平台, 其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如 Word、PDF)的处理。Solr 是高度可扩展的,并提供了分布式搜索和索引复制。Solr 4 还增 加了 NoSQL 支持,以及基于 Zookeeper 的分布式扩展功能 SolrCloud。SolrCloud 的说明可 以参看:SolrCloud 分布式部署。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功 能,Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行 了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能 进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。 Solr 可以高亮显示搜索结果,通过索引复制来提高可用,性,提供一套强大 Data Schema 来定义字段,类型和设置文本分析,提供基于 Web 的管理界面等。 Key-Value Store Indexer 这个组件非常关键,是 Hbase 到 Solr 生成索引的中间工具。 在 CDH5.3.2 中的 Key-Value Indexer 使用的是 Lily HBase NRT Indexer 服务. Lily HBase Indexer 是一款灵活的、可扩展的、高容错的、事务性的,并且近实时的处理 HBase 列索引数据的分布式服务软件。它是 NGDATA 公司开发的 Lily 系统的一部分,已开放 源代码。Lily HBase Indexer 使用 SolrCloud 来存储 HBase 的索引数据,当 HBase 执行写 入、更新或删除操作时,Indexer 通过 HBase 的 replication 功能来把这些操作抽象成一系 列的 Event 事件,并用来保证写入 Solr 中的 HBase 索引数据的一致性。并且 Indexer 支持 用户自定义的抽取,转换规则来索引 HBase 列数据。Solr 搜索结果会包含用户自定义的 columnfamily:qualifier 字段结果,这样应用程序就可以直接访问 HBase 的列数据。而且 Indexer 索引和搜索不会影响 HBase 运行的稳定性和 HBase 数据写入的吞吐量,因为索引和 搜索过程是完全分开并且异步的。Lily HBase Indexer 在 CDH5 中运行必须依赖 HBase、 SolrCloud 和 Zookeeper 服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值