2016年
软      件
2016, V ol. 37, No. 11
作者简介:崔丹(1990-),女,硕士研究生,主要研究方向为数据库集中间件负载均衡技术
基于Redis 实现HBase 二级索引的方法
崔  丹1,史金鑫2
(1. 北京邮电大学网络技术研究院,北京市  100876;2. 上海欣方智能系统有限公司北京分公司,北京市  100085)
摘  要: 随着大数据时代的到来,海量数据对传统数据库技术提出了存储和检索性能的挑战。HBase 是开源NoSQL 数据库,适合于各种非结构化和半结构化的松散数据的存储和管理,目前已经被很多大型企业用于处理海量数据。它基于rowkey 的有序存储,对rowkey 支持毫秒级的快速检索。然而,随着HBase 应用
的不断深入,单一的通过rowkey 检索数据的方式不再满足需求,在实际应用中,经常需要根据指定字段,或者几个字段进行组合检索。针对该问题,本文提出了一种基于Redis 创建HBase 二级索引的方法,使得在实际应用中,支持多条件查询,提升查询的效率和性能。
关键词: 大数据;HBase ;二级索引;rowkey ;Redis
中图分类号: TP311    文献标识码: A    DOI :10.3969/j.issn.1003-6970.2016.11.015
本文著录格式:崔丹,史金鑫. 基于Redis 实现HBase 二级索引的方法[J]. 软件,2016,37(11):64-67
Implementation of HBase Secondary Index Based on Redis
CUI Dan 1, SHI Jin-xin 2
(1. Network Technology Research Institute, Beijing University of Posts and Telecommunications, Beijing 100876, China ;
2. Shanghai Cintel Intelligent System Co., Ltd. Beijing Branch, Beijing 100085, China )
【Abstract 】: With the arrival of the big data era, these massive data challenges traditional storage and retrieval per-formance for traditional database technologies. HBase is open source NoSQL database, suitable for a variety of un-structured and semi-structured data storage and management of the loose, and has been used by many large enterprises to deal with massive data. It is based on the rowkey of the orderly storage, supporting millisecond-level rapid retrieval based on rowkey. However, with the deepening of HBase applications, a single rowkey retrieval of data by no longer meet the needs of more applications. The practical applications often need to specify the field, or a combination of several fields to retrieve. To solve this problem, this paper proposes a method of creating HBase secondary index based on Re-dis, which can support multi-conditional query and improve query efficiency and performance in practical application. 【Key words 】: Bid data; HBase; Secondary index; Rowkey; Redis
0  引言
随着信息技术的发展,网络己经成为人们交流、娱乐等活动的主要工具,互联网的内容越来越丰富,数据规模也愈加庞大[1]。一些国内外著名的社交网站Facebook 、Twitter 、LinkedIn ,搜索网站Coogle 、Yahoo 、Baidu 、Sougo ,购物网站Amazon 、Taobao 等大型网站,它们的用户规模庞大,网络请求并发性高,需要处理甚至级的数据[2]。大数据时代的到来,对传统关系型数据库的存储和检索性能提
出了挑战,无法满足这么大规模数据的高效存储与高并发读写需求。为了解决这个问题,一些公司、研究结构纷纷开发云上的数据库系统,
它们统称为NoSQL 。NoSQL 是指用于存储和处理大规模结构化或非结构化数据,能够随着数据规模增大而扩展的数据库系统[3]。
HBase (Hadoop Database ,Hadoop 数据库)是参照Google Bigtable 实现的开源NoSQL 数据库,它具有强一致性、高性能随机写、面向字段且可动态修改、可水平伸缩的特性,适合于各种非结构化和半结构化的松散数据的存储和管理,目前已经被很多大型企业用于处理海量数据[4]。然而,它本身还存在着一些问题, 如仅支持主索引结构,不支持跨行事务等,这些问题都严重制约着HBase 的进一步发展。针对该问题,本文提出了一种基于Redis 实现HBase 二级索引的方法,对HBase 表中涉及条
崔  丹等:基于Redis 实现HBase 二级索引的方法
65
《软件》杂志欢迎推荐投稿:cosoft@vip.163
件过滤的字段和rowkey 在Redis 中建立索引,通过Redis 的多条件查询快速获得符合过滤条件的row-key ,之后在HBase 中通过获得的rowkey 进行查询,提升多条件查询的效率和性能。
1  HBase 二级索引技术研究
随着大数据时代的到来,海量数据的规模超过常规数据库工具获取存储管理和分析能力。大数据具有5V1C 的特征:数据量巨大(Volume )、数据类型繁多(Variety )、生成速度快(Velocity )、数据易变化(Variability )、数据真实性(Veracity )、数据复杂性(Complexity )[5]。HBase 数据库在存储大数据方面性能较好,但是需要进一步优化对海量数据的结构化查询。由于HBase 基于rowkey 的有序存储,对基于rowkey 的查询十分高效,然而进行关系型数据库那样可以随意组合的多条件查询、查询总记录数、分页查询等表现不佳。目前,可通过以下两种方法解决该问题。第一种方法是使用HBase 提供的过滤器,该过滤器可以对HBase 中的数据在多个维度上进行检索操作。该方法使用起来简单,但局限性较大,过滤器直接扫描HBase 表,如果数据表范围很大,会导致查询速度很慢。第二种方法是实现HBase 二级索引,通过查询二级索引获得符合条件的rowkey ,然后再通过rowkey 查询HBase 数据。该方法适用范围比较广泛。
二级索引方案类似于关系数据库中的二级索引,为了实现对非rowkey 的查询,需要为每一个索引列构建
一个索引表,实现索引列与原有rowkey 的映射[6]。目前实现HBase 二级索引的方法主要是以下两种:
第一种方法通过HBase 协处理器生成并访问索引数据,将索引数据单独存储为一张表。该方法的缺点是数据表与索引表的数据一致性很难保证,访问两张不同的表也会增加远程调用的次数和IO 开销。
第二种方法是将数据和索引数据存储在相同的分区里,将索引数据定义为一个单独的字段族,也是需要通过协处理器来生成并访问二级索引数据。该方法中,单表的数据容量会急剧增加,对多个字段族进行拆分或合并等操作时可能会造成数据丢失或不一致。
2  基于Redis 实现HBase 二级索引方法
Redis 是一个开源的使用ANSIC 语言编写、支
持网络、可基于内存亦可持久化的日志型、高性能的Key-Value 数据库[7]。根据官方的bench-mark 数据,测试完成50个并发执行100000个请求,设置和获取的值是一个256字节字符串时读的速度可达到110000次/s ,写的速度可达到81000次/s 。它支持存储的数据类型包括字符串、链表、集合、有序集合和哈希类型。通过使用集合和有序集合实现对非rowkey 的精确查询和范围查询创建不同的二级索引,以提升多条件查询的效率和性能。
图1  基于Redis 实现HBase 二级索引的组成结构 Fig.1  the structure of achieving the HBase secondary
index based on Redis
如图1所示,基于Redis 实现HBase 二级索引的系统组成主要包括客户端、数据处理模块、二级索引模块。客户端发出数据更新、查询、删除请求,数据处理模块对请求进行分别处理,进行数据的更新、查询和删除,相应地,二级索引模块根据客户端的请求进行二级索引的更新、查询和删除。基于Redis 实现HBase 二级索引时,协处理器相当于一个回调函数。协处理器通过配置可以实现作用到HBase 中所有表,也可以单独指定作用到一张表。当用户操作get/put/delete 数据的时候,HBase 的regionserver 会在 get/put/delete 方法的时候,回调一个实现协处理器类中的方法,方法中可以获得你get/put/delete 的数据,从而实现构建二级索引的操作。
HBase 在对非rowkey 进行检索的过程如图2所示。将HBase 表中涉及条件过滤的字段和rowkey 在Redis 中建立索引,通过Redis 的多条件查询快速获得符合过滤条件的rowkey 值,再根据获得的rowkey 在HBase 中通过rowkey 进行查询,进而提高查询的效率。
3  HBase 二级索引数据结构设计
在实际应用中,对HBase 数据的查询包括两种,一是基于rowkey 条件查询,此时不需要对HBase 表中数据建立二级索引便可获得较高的查询速度;二是基于非rowkey 的条件查询,包括精确查询和范围查询,此时可通过Redis 的set 和sorted set 实现
第37卷  第11期
软    件
66
《软件》杂志欢迎推荐投稿:cosoft@vip.163
图2  基于Redis 实现HBase 非rowkey 查询过程
Fig.2  the process for HBase non-rowkey query
based on Redishbase的特性有哪些
二级索引,进而获得较高的检索效率。set 和sorted set 类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个set 中。它们之间的主要差别是sorted set 中的每一个成员都会有一个分数(score )与之关联,Redis 正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets 中的成员必须是唯一的,但是score )是可以重复的。
以HBase 中数据表为例,如表1,对age 建立二级索引:
表1  HBase 数据表
Tab.1  a data table of HBase
rowkey
family :qualifier
value
rowkey1 family1:name Alice rowkey2 family1:age 12 rowkey3 family2:name Tom rowkey4 family2:age
15
基于非rowkey 的精确条件查询,建立的二级索引结构为key-value ,key 为列名_值,value 为rowkey 。使用Redis 的set 类型进行存储,sadd (key ,value )添加二级索引,生成的二级索引如表2所示下:
表2  Redis 中set 存储二级索引
Tab.2  the secondary index stored in Redis set
key
value
age_12 rowkey2 age_15 rowkey4
基于非rowkey 的范围条件查询,建立的二级索引结构为key-score-value ,key 为列名,score 为列值,value 为列值_rowkey 。使用redis 的sorted set
类型进行存储,方法zadd (key ,score ,value )添加二级索引,score 是按序存储的。生成的二级索引如下:
表3  Redis 中sorted set 存储的二级索引
Tab.3  the secondary index stored in Redis sorted set
key
score
value
age 12 12_rowkey2 age 15 15_rowkey4
4  HBase 二级索引数据结构设计
本文在Centos 6.5上部署分布式HBase 和Redis 系统,安装的软件版本是JDK1.7.0_55,Hadoop 1.1.2,HBase 0.96.2,Redis 3.2.1。在对HBase 建立二级索引之后,分别对HBase 系统进行了插入和查询数据两方面的性能测试。
本文使用插入语句进行测试,分别在插入语句条数为1 W 、10 W 和100 W 的时候进行测试,并针对列足否有索引的情况分别进行测试。为了减少测试误差,采用多次测试然后取平均值的方法进行测试。插入性能的测试结果如表4所示:
表4  HBase 的插入性能测试结果
Tab.4  the results of testing for HBase insert performance
插入条数(万) 1 10 100
无二级索引(毫秒)5409.3 15735.4 105240.9 有二级索引(毫秒)
6023.7 18234.6 140730.2
根据测试结果可知,在实现二级索引的情况下,插入数据需要耗费更多的时间。这是因为,在HBase 中插入数据后,还需要触发协处理器创建相应的二级索引存入Redis 。在有索引和无索引的时插入数据,会随着入库数据的条数增加而增加。这两种情况下在HBase 插入操作都是根据rowkey 进行插入的,而数据表是按照rowkey 顺序分布式存储的,因此在需要建立二级索引的情况下多花费的时间即为写入Redis 的时间。
本文使用查询语句对HBase 查询性能进行测试,分别在查询语句条数为1 W 、10 W 和100 W 进
行测试。查询性能的测试结果如表5所示:
表5  HBase 的查询性能测试结果
Tab.5  the results of testing for HBase select performance
查询条数(万)
1 10 100 无二级索引(毫秒)4567.8 5367.3 6023.7 有二级索引(毫秒)
304.2 426.4 537.6
崔  丹等:基于Redis 实现HBase 二级索引的方法
67 《软件》杂志欢迎推荐投稿:cosoft@vip.163
根据测试结果可知,在实现二级索引的情况下,HBase 查询性能极大提升。这是因为HBase 在执行基于rowkey 的查询时,查询速率很高,而在建立二级索引的情况,系统会将对非rowkey 的查询,通过查询Redis 中的二级索引获得符合条件的rowkey ,再通过rowkey 在HBase 中获得数据集,间接地将基于非rowkey 的查询转化为基于rowkey 的查询,获得较高的查询效率。
本文对上述所有测试结果进行综合分析,得出如下结论。釆用二级索引能够极大提高数据査询的效率,实现海量数据旳实时查询。通过二级索引进行数据查询、更新和删除操作时,都是先对索引表按rowkey 查询取得索引数据,再根据HBase 表的rowkey 进行相应操作。按照rowkey 顺序进行存储,根据rowkey 进行查询操作的效率很高。
5  结论
本文提出了一种基于Redis 实现HBase 二级索引的方法,当客户端向HBase 中写数据时,触发协处理器,根据当前表的索引规则在Redis 中创建二级索引。在创建二级索引的过程中使用了数据库连接池,减少了由于不断创建新连接的开销,实现快速构建二级索引。在该方法中,实现了多表对应一个协处理器的机制;可对索引字段进行灵活配置,以满足精确查询和范围查询的需求;实现基于内存数据库的二级索引存储机制,将HBase 数据表生成的二级索引存储在Redis 内存数据库。当客户端发出查询请求时,可以快速查询二级索引,大幅提升访问效率。
参考文献
[1]
李国杰, 程学旗. 大数据研究: 未来科技及经济社会发展的重大战略领域——大数据的研究现状与科学思考[J]. 中
国科学院院刊, 2012, 27(6): 647-657.
LI G J, CHENG X Q, XUE W W. Big Data Research: Major Strategic Fields for Future Technology and Economic and Social Development-Research Status and Scientific Thinking of Big Data[J]. Chinese Academy of Sciences, 2012, 27(6): 647-657. (in Chinese)
[2]
王珊, 王会举, 覃雄派等. 架构大数据: 挑战、现状与展望[J]. 计算机学报, 2011, 34(10): 1741-1752.
WANG S, WANG H J, QIN X P, et al. Architectural Big Data: Challenges, Status Quo and Prospects[J]. Chinese Journal of Computers, 2011, 34(10): 1741-1752. (in Chinese) [3] 卢益阳. NoSQL 数据管理系统综述[J]. 企业科技与发展, 2011, (17): 31-33.
LU Y Y. A Survey of NoSQL Data Management System[J]. Enterprise Science Technology and Development, 2011, (17): 31-33. (in Chinese)
[4] 卓海艺. 基于HBase 的海量数据实时查询系统设计与实现[D]. 北京:北京邮电大学,2013.
ZHUO H Y. Design and Implementation of Real - time Query System Based on HBase for Massive Data[D]. Beijing: Bei-jing University of Posts and Telecommunications, 2013. (in Chinese) [5]
孟小峰, 慈祥. 大数据管理: 概念、技术与挑战[J]. 计算机研究与发展, 2013, 50(1): 146-169.
MENG X F, CI X. Big Data Management: Concepts, Tech-nologies and Challenges[J]. Computer Research and Devel-opment, 2013, 50(1): 146-169. (in Chinese) [6]
马友忠, 孟小峰. 云数据管理索引技术研究[J]. 软件学报, 2015, 26(1): 145-166.
MA Y Z, MENG X F. Research on Cloud Data Management Index Technology[J]. Journal of Software, 2015, 26(1): 145- 166. (in Chinese) [7]
曾超宇, 李金香. Redis 在高速缓存系统中的应用[J]. 微型机与应用, 2013, 32(12): 11-13.
ZENG C Y, LI J X. Application of Redis in Caching Sys-tem[J]. Microcomputer and Its Applications, 2013, 32(12): 11-13. (in Chinese)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。