基于协处理器的HBase内存索引机制的研究
朱松杰1,娄渊胜1,叶
枫1,2
,李
凌1,陈勇2
1.河海大学计算机与信息学院,南京211100
2.南京龙渊微电子科技有限公司博后工作站,南京211106
摘
要:为了实现对海量数据的高效存储和查询,众多NoSQL数据库被开发出来,HBase是其中之一。但原生的
HBase数据库在进行数据查询时只支持主键索引,对非主键数据只能通过全表扫描的方式进行查询,极大降低了HBase的多条件查询速度。为此,提出了基于协处理器的HBase内存索引构建方案,通过协处理器实现对二级索引的快速构建并可根据HBase表的变化自动更新索引。同时,将建立的索引进行持久化操作,在使用时通过内存计算,极大地提高了索引数据检索速度,保证了索引的可用性和容错性。实验结果表明,该方案相比原生数据库的条件检索速度有了极大提升,相比于基于Solr和HiBase的二级索引方案检索速度也有所提升。关键词:HBase;内存索引;HT树;持久化文献标志码:A
中图分类号:TP311
doi:10.3778/j.issn.1002-8331.1810-0087
朱松杰,娄渊胜,叶枫,等.基于协处理器的HBase内存索引机制的研究.计算机工程与应用,2020,56(1):98-105.ZHUSongjie,LOUYuansheng,YEFeng,etal.ResearchandimplementationofHBasememoryindexingschemebasedoncoprocessor.ComputerEngineeringandApplications,2020,56(1):98-105.
ResearchandImplementationofHBaseMemoryIndexingSchemeBasedonCoprocessor
ZHUSongjie1,LOUYuansheng1,YEFeng1,2,LILing1,CHENYong2
1.DepartmentofComputerandInformation,HohaiUniversity,Nanjing211100,China2.PostdoctoralCentre,NanjingLongyuanMicro-ElectronicCompany,Nanjing211106,China
Abstract:Inordertoachieveefficientstorageandqueryofmassivedata,manyNoSQLdatabaseshavebeendeveloped,andHBaseisoneofthem.However,thenativeHBasedatabaseonlysupportstheprimarykeyindexwhenperformingdataquery,andthenon-primarykeydatacanonlybequeriedbymeansoffulltablescan,whichgreatlyreducesthemulti-conditionqueryspeedofHBase.Tothisend,aHBasememoryindexconstructionschemebasedoncoprocessorisproposed.ThecoprocessorisusedtoquicklyconstructthesecondaryindexandtheindexcanbeautomaticallyupdatedaccordingtothechangeoftheHBasetable.Atthesametime,theestablishedindexispersisted,andthememorycalculationisusedinuse,whichgreatlyimprovestheretrievalspeedoftheindexdata,andensurestheavailabilityandfaulttoleranceoftheindex.Experimentsshowthattheconditionretrievalspeedoftheschemeisgreatlyimprovedcomparedwiththeoriginaldatabase,andtheretrievalspeedofthesecondaryindexschemebasedonSolrandHiBaseisalsoimproved.Keywords:HBase;memoryindex;HTtree;durability
1引言
的新需求。互联网先驱不得不重新设计数据库,大数据随着大数据时代的到来,传统的关系型数据库难以
系统和NoSQL(Not-Only-SQL即非关系型数据库)越来处理无规范模式的数据集,并且随着数据集规模的增越多地被开发出来,例如Facebook的Cassandra、Amazon大,不能提供高效的存储和查询服务,也不能满足系统
的Dynamo以及支持高效数据查询的内存数据存储系
基金项目:2017江苏省博士后科研资助计划(No.1701020C);2017江苏省“六大人才高峰”资助项目(No.XYDXX-078);中央高校基本业务费(No.2013B01814)。
作者简介:朱松杰(1993—),男,硕士研究生,研究领域为分布式计算、数据挖掘;娄渊胜(1968—),男,博士,副教授,研究领域为软件
工程、智能数据处理;叶枫(1980—),通信作者,男,博士,讲师,研究领域为分布式计算,E-mail:yefeng1022@hhu.edu.cn。
收稿日期:2018-10-10
修回日期:2019-01-09
文章编号:1002-8331(2020)01-0098-08
CNKI网络出版:2019-01-11,http://kns.cnki.net/kcms/detail/11.2127.TP.20190110.1735.016.html
朱松杰,等:基于协处理器的HBase内存索引机制的研究2020,56(1)99
统Redis等[1]。这些数据库的数据存储都采用了key-value许多研究者已经使用Coprocessor来构建HBase二数据模型,HBase便是key-value数据库中使用最为广级索引,具体有两种解决方案:一种是直接存储到数据泛的[2]。
库或文件中实现索引持久化,但这种方法的索引检索效在Google的BigTable论文的发表后,Cafarella在率较低,另一种是通过构建内存索引,并存储到特定环Hadoop上面实现了BigTable的一个开源版本,被称为境中实现持久化。从开发设计的角度看,把很多对二级HBase[3]。HBase由多个软件子系统组成,主要包括客户索引管理的细节都封装在的Coprocessor具体实现类里端、HMaster、HRegionServer、Zookeeper等,这些子系统面,这些细节对外面读写的人是无感知的,简化了数据共同组成一个分布式应用系统,它具有开源、分布式、可访问者的使用。虽然具有一定的入侵性,会对Region-扩展及面向列存储的特点,能够为大数据提供随机、实Server性能产生一定影响。
时的读写访问功能。如何从海量数据中快速获得所需对于非Coprocessor方案,不基于Coprocessor开发,数据是使用HBase等NoSQL数据库的一个重要原因,而是自行在外部构建和维护索引关系。常见的是采用HBase在其主键上建立了B+树索引,在使用主键进行查底层基于ApacheLucene的Elasticsearch[9],来构建强大询时效率很高[4]。但是,在进行非主键的条件查询时,由的索引能力、搜索能力,例如支持模糊查询、全文检索、于缺少主键的支撑,HBase必须进行全表扫描,导致查询效率低下,无法满足上述要求。对此,本文在借鉴关组合查询、排序等。LilyHBaseIndexer(也简称HBase系型数据库解决方案的基础上,提出了一种基于二级索Indexer)是国外的NGDATA公司开源的基于solr的索引引的查询机制,并将索引数据存储在内存数据库中,通构建工具,特色是其基于HBase的备份机制,开发了一过内存进行二级索引检索,进一步提高了对大数据的实个叫SEP工具,通过监控HBase的WAL日志(Put/Delete时查询响应。
操作),来触发对solr集群索引的异步更新,基本对HBase无侵入性[10]。葛微等人[3]提出了名为HiBase的二2相关工作
级索引,它是一种基于分层式索引的设计方案,其将热HBase是一个构建在HDFS之上,用于海量数据存
点索引进行缓存,并建立高效的缓存替换策略来提高二储分布式列存储系统[5]。HBase表的每行都是按照级索引的查询速度。Zou等提出了互补聚簇式索引RowKey的字典序排序存储,每行数据是按照RowKey(ComplementalClusteringIndex,CCIndex),该方案把区间进行分割存储成多个Region。HBase只针对行健数据的详细信息也存放在索引表中,不需要通过获取的的索引,在原生产品中访问HBase表中的行只能通过行行键再到原表中去查找数据。使用非Coprocessor方案健访问,行健区间访问和全表扫描三种。
时,如存储开销比较大,尤其是当索引列比较多的时候,当前,国内许多使用HBase的企业或者个人都会对空间开销会更大。索引更新代价比较高,会影响系统的其建立索引来提高性能,比较常见的有基于Coprocessor吞吐量,索引创建以后,不能够动态增加或修改。
方案,如华为的HIndex方案和ApachePhoenix方案[6]。其综上,本文使用基于观察者模式的Coprocessor方支持自定义数据处理逻辑,采用数据“双写”(dual-write)法实现二级索引功能,并通过分布式存储保证二级索引策略,在有数据写入时同时同步到二级索引表。相比于的高可用和高容错性。提出了基于Coprocessor的索引华为的HIndex,ApachePhoenix的版本迭代情况较好,构建方案,并且针对协处理器索引检索速度问题,构建支持和兼容多个HBase版本,二级索引只是其中一块功了内存索引,意图是提高索引检索速度。
能[6]。同时,二级索引的创建和管理直接有SQL语法的支持,使用简单。王文贤等人[7]实现了一种基于Solr的3所提出的索引机制
HBase海量数据二级索引方案,该方案主要对华为Hindex所提机制的总体结构如图1所示。其中,索引管理
进行改进,其基于数据存储和索引分离的思想,将Solr检模块是框架核心,在用户对数据表进行更新操作时,协索与HBase的大数据存储结合起来,具有一定的通用处理器Coprocessor会对这些请求进行拦截,并对索引性。丁飞等人[4]实现了基于协处理器的HBase区域级服表进行相应操作,包括插入、删除和更新索引的元数据务端区域级第二索引扩展功能,索引存储格式选HBase(记录用户表对应的索引表名称、索引列等信息)。执自身的数据组织方式,即HFile文件格式。利用HFile高行查询操作时,系统会在缓存中寻找对应索引位置,提效的IO性能保证索引查询的效率。周伟等人[8]对HBase高了索引检索速度,当缓存中的索引更新时,索引管理分布式二级索引通用方案进行研究,引入分布式索引机模块也会对索引进行更新。索引持久化管理模块主要制,在SolrCloud中完成对索引的管理,借助协处理器提对缓存索引进行持久化操作,提供索引表和值表的持供的索引功能为HBase记录创建、存储索引,其中HBase久化存储,HBase为持久化存储数据提供可扩展性和容负责存储数据,Solr负责索引数据和检索。
错性。
1002020,56(1)ComputerEngineeringandApplications计算机工程与应用
ObserverCoprocessor使用场景如下。
查询数据更新(1)安全性:在执行Get或Put操作前,通过preGet缓存索引更新或prePut方法检查是否允许该操作。
索引管理模块(2)引用完整性约束:HBase并不直接支持关系型节点服务器数据库中的引用完整性约束概念,即通常所说的外键。缓存存储缓协处理器拦截处理处理存更新内外Zookeeper数据表插入数据表删除但是,可以使用Coprocessor增强这种约束。
存地址映射外存索引文件插入外存索引文件删除(3)二级索引:可以使用Coprocessor来维持一个二级索引。
外存索引文件更新Endpoint协处理器类似传统数据库中的存储过程,索客户端可以调用这些Endpoint协处理器执行一段Server引持索端代码,并将Server端代码的结果返回给客户端进一久数引外化据缓存步处理[12]。利用Coprocessor,用户可以将代码部署到模表存文HBaseServer端,HBase将利用底层cluster的多个节点块表件并发执行。Endpoint不仅能与客户端通信,而且能与图1系统总体结构图
Observer进行通信。Observer可以在回调方法里通知3.1Coprocessor基本概念
Endpoint,执行一定的事件响应逻辑。两种处理器的共同由于HBase无法定制服务端逻辑,使得用户无法在
协作可以定制功能强大的HBase应用,既可以实现对集服务端实现自己需求的二级索引方案,HBase在0.92版群中每个Region数据变更的监控,又可以通过Endpoint本中引入了协处理器Coprocessor机制,它受启发于将处理结果返回给客户端。
Google的Bigtable的协处理器,为实现建立二次索引、3.2Coprocessor二级索引实现
复杂过滤器(谓词下推)以及访问控制等提供了一种很协处理器机制支持用户根据业务要求,重写Endpoint
好的解决方案[11]。协处理器是一种服务端组件,类似于和Observer代码,本文使用Observer协处理器来进行索轻量级的MapReduce,它的主要思想是通过将集群内的引的构建。Observer协处理器类似于关系型数据库中数据移动取代为计算移动来减少计算代价,提高效率。的触发器,当对数据库进行增删改查操作时,Observer其可理解为服务端的拦截器,可根据需求确定拦截点,会对这些请求进行拦截,并根据这些请求,实时更新索再重写这些拦截点对应的方法。协处理器允许在引表。二级索引的整体架构图如图3所示。
Region服务器上运行自己的代码,更准确地说是允许用HbaseClient户执行Region级的操作,并且可以使用与RDBMS中触发器(trigger)类似的功能。
HmasterRegionServerCoprocessor可以分为两大类:ObserverCoprocessorsCoprocessorHostCoprocessorHost(观察者)和EndPointCoprocessor(终端)。ObserverCoprocessor在一个特定的事件发生前或发生后触发,其IndexingCoprocessor工作过程如图2所示。
RowkeyCf1:aRowkeyCf1:a客户端0121120202121404Put操作Delet操作033221010414320图3
二级索引架构图
rev执行postPut()re建立的索引结构如图3所示,采用了倒排的方法,RegoinNsbO执行postDelet()将数据表的值与主键进行交换,原本的值充当主键,原EndPoint本的主键放在值的位置,一个最基本的索引表即构建完毕。在未建立索引前,HBase的数据模型可形式化表示为:
RPCR→{Ci→{CQi→{Ti|Vi}}},i=0,1,2,…,n
客户端其中行健为R,列族为C,列限定符为CQ,时间戳为图2协处理器工作过程
T,值为V。则二级索引的形式化表示为:
Vi→{Ci→朱松杰,等:基于协处理器的HBase内存索引机制的研究2020,56(1)101
{CQi→{Ti|R}}},i=0,1,2,…,n。
户的重写,以实现在Put操作完成后的索引逻辑。由此框架保证了索引文件和主表在同一个Regionserver可以看出,在Put操作未完成时,监听器将监听到这一事上,这样可以保证在需要使用索引文件时只需与Region-件,从而不会调用postPut方法,索引逻辑将无法完成,Server建立一次连接就可以完成,提高了速度。在此架保证了索引与原数据表的一致性与事件性,不会出现索构中,用户首先在配置文件(hbase-site.xml)中设定索引引与原数据表无法匹配的情况。
的细节,主服务器从配置文件中获取需要建立的索引信ClientCp:息,然后在对应的RegionServer中的IndexingCoprocessorClient:HTableTable:Rs:HregionServerRsgionHrehion:coprocessorHost:Ro:RgionHostOberver中建立索引同时管理二级索引数据。每个节点上都部Put(new署了协处理器Coprocessor,部署之后RegionServer端中Put())Put(Put)Put(Put)prePut(Put)prePut(Put)Index-的每个区域Region上都会自动创建一个区域协处理UpdataRegionCoprocessorHost实例,它的主要功能是用来维护系统级或表级的区域观察者协处理RegionObserver。PostPutPostPut每当RegionObserver启动时会将RegionCoprocessorHost(Put(Index-result,)resultPut,)Updata初始化,初始化的过程中,RegionCoprocessorHost会加resultPostPut载当前服务端所有的RegionObserver。索引管理由扩result(Put,result)resultresult展的RegionObserver实例(IndexRegionObserver)完成。IndexRegionObserver主要的扩展接口如表1所示。
图4索引表更新过程
表1
IndexRegionObserver主要扩展接口
索引的使用:在构建完索引表后,当进行索引查询时,客户端需要进行Scan操作,此操作将会被协处理器IndexRegionObserver
扩展接口接口说明
拦截,将检索条件截取,并从索引表中找出符合条件的Start()完成初始化工作
索引项,返回原数据表的Rowkey,数据表根据Rowkey查询即可。
postOpen()在每一个Region被打开后调用,用于读索引文件并建立索引
3.3内存索引构建
preFlush()在MemStore被写到内存里,用于对新数Coprocessor构建的索引只是在逻辑上实现了索
据创建索引
引结构,为了提高检索Coprocessor索引速度,需要对postWALRestore()恢复WAL日志后重建这一部分数据的索引Coprocessor构建的索引进行特定结构设计,内存索引preScannerOpen()
客户端发起查询时,使用扩展的Scanner完成索引查询操作
设计即可完成上述目标。内存的索引相较于传统位于用于合并索引文件,MemStore多次写入磁盘的索引在设计和架构上都大不相同,基于内存的文件后索引目录下的索引文件数也越来索引在查询效率上得到了极大提升。广泛采用的内存preCompact()
越多,扩展该接口随RegionServer的压缩索引有T树、基于缓存敏感的CSS/CSB+树和改进的调度同时进行索引文件压缩
Hash索引等[13]。使用了HT树构建内存索引,其结构如presplit()当Region被分割时,索引文件也必须作图5所示。
出相应的调整
18postOpen()在每一个Region被打开后调用,用于读索引文件并建立索引
在MemStore被写到内存里,用于对新数112836preFlush()
据创建索引
下面以Put拦截器举例说明索引表的更新过程:4,7,1013,1619,2529,352,5,811,1420,2630,33如图4所示,在数据表进行Put操作时,数据表会监3,91518,2131,32测插入数据的Rowkey,并由此定位到RegionServer上图5HT树的结构
的Region,该事件在Put操作之前被CoprocessorHost如图5所示,每个叶子节点有4个哈希表,每个哈希拦截,并自动调用此Region上进行监听的Observer的表中有3个哈希桶,在使用HT构建内存索引时,需要通prePut方法。用户可以根据自己的需求对这个方法重过查找算法查找到关键字可以插入的哈希表,然后通过写,更新索引。在索引更新完成后,即Put方法执行完成计算,找到关键字可插入的哈希桶,判断哈希桶是否已后,Put之后的事件会再次被CoprocessorHost拦截,并调满,若已满则分裂该节点,将该关键字插入,若未满则直用监听器Observer的postPut方法,同样,该方法支持用
接插入哈希桶。
1022020,56(1)ComputerEngineeringandApplications计算机工程与应用
内存索引工作流程与一般索引的使用过程有所不endfor
同,具体流程如下:
foreachmapMinHedo
(1)内存索引初始化
ifkey[M]<kethen//当遍历映射的键小于范围结
当向数据表的构建过程中,需要同步进行内存索引束的关键字时
的建立,对外提供检索服务。在第一次请求索引检索RQ∪value[M]
时,系统会检查内存索引是否为空,如果为空,则进行索endif引的初始化操作,建立内存索引。
endfor(2)Put操作过程
endfor
Put操作在HBase中相当于插入操作,当HBase执(5)Region分片过程
行这个操作时,当前操作发生的Region上的Observer会Region分片主要为了解决在数据表数据增加时,数拦截这个事件,向内存索引中插入一条对应的索引项。
据行超出预设分片大小的情况。当数据表发生分片过(3)Delete操作过程
程即Split操作时,对应的内存索引对象也会随之发生变和Put操作相似,当客户端执行Delete操作时,化[14]。分片时,Region将会从一个变为两个,数据表的HBase将从表中删除一条记录,当前操作发生的Region也会一分为二,分别存于两个Region中,此时Observer会监测到Split事件,通知Endpoint重新构建索引表。如上的Observer会拦截这个事件,在内存索引中删除一条图6所示。
对应的索引项。
(4)查询操作过程
RowkeyCf1:aRowkeyCf1:a01211202该机制中,为了提高查询效率,尽量将数据处理过02121404程本地化。在协处理器拦截到查询请求后,将会构建检0332210104143203索条件,根据条件在内存索引中进行多线程检索。得到满足检索条件的Rowkey后,返回数据表中查询原始数据,将结果返回客户端。在内存中检索的过程如下:
RowkeyCf1:aRowkeyCf1:a在进行内存索引查询时,首先在哈希表中进行查0121120202122101找,定位关键字所在桶,继续在桶中查找,若找到,则指针指向所需记录。当关键字处于内部节点,且它的键为RowkeyCf1:aRowkeyCf1:aK033214041,K2,…,Kn。如果key 数据表从第三项分裂成两张表,协处理器在原索引算法1内存索引查找算法 表第一行构建索引游标,以此标记向后检索并在Region输入查询范围[k的数据表中寻找是否有此条记录,若存在则保留数据记s,ke]的关键字ks,ke。输出行键集合RQ。录,否则删除,索引表由此更新完成。内存索引构建在RQ←[∅]//结果集合设为空 索引表主键之上,由于索引主键结构的改变,原索引结H构需要初始化操作,即步骤一操作。新分片的内存索引s←T.GetHash(ks)//通过树形索引查找ks所在的 哈希表 对象存储在新的Region协处理器中。 He←T.GetHash(ke)3.4内存索引持久化 H←Hs 由于内存索引的维护都由协处理器完成,因此,内 whilenext[H]≠Hsdo存持久化的操作主要为了保证内外存数据的一致性,保H←next[H] 证主机断电时不用重新构建索引,不涉及对索引创建操RQ∪allValue[H]//将哈希表中所有值并入结果 作。提出了内存索引持久化方法,将建立的内存索引从集合中 内存中映射到外存中,用于持久化内存索引的外存区域endwhile 索引文件由存储索引信息的索引头和索引结构组成,索foreachmapMinHsdo//遍历哈希表 引文件与内存空间采用内存映射技术mmap保持一致ifkey[M]>ksthen//当遍历映射的键大于范围开 性[15],映射时会使用地址转换表,将索引文件中的地址始的关键字时 转换为内存中地址,并一一对应。在对内存索引结构进RQ∪value[M]//将映射的值并入结果集合中 行修改时,外存索引文件也会自动更新。具体的内存持endif 久化流程如图7所示。 朱松杰,等:基于协处理器的HBase内存索引机制的研究 2020,56(1)103 开始4.2插入性能对比 查询实验在分布式环境下进行,通过3台客户端同时向 HBase表中插入数据,并在3台客户端上统计每500万是是否存在索引数据的Put时间,为了保证实验的准确性,进行30次重否复测试,并将结果累加求得均值。实验分别测试了无索创建外存索引文件引、基于solr的索引、HiBase和本文提出的基于协处理调用mmap将外存文件映射入内存器与内存的索引方案在相同条件下的Put时间,结果如图8所示。 在构建或更新内存索引120更新外存索引文件100Noindex5016Hibase8908n867277i80Basedonsolr7解除内外存映射m8/间60Basedonmemory560156时2145428454结束403125320052211图7内存持久化流程 8990在上述流程图中,一个重要的步骤即如何将索引文50010001500200025003000数据量/万条件映射入内存,索引文件映射入内存后返回的是虚拟地图8插入实验结果址,索引结构数据没有进入内存中。为了保证索引结构完全处于内存中,要使用相应的方法将索引结构逐步导从实验结果可以看出,Put效率执行最高的是无索引方案,这是因为在进行Put操作时,无索引方案无需分入内存,采用了层次遍历的方法,将索引树完全遍历,所配资源进行索引的构建,而其他需构建二级索引的方案有索引结构便处于内存中。 在将数据放入数据表的同时,会触发协处理器对Put操作进行拦截,并调用用户自定义的方法开始构建二级索4实验与结果分析引。同时也可得出,在前对500万条数据进行Put操作4.1 实验环境与数据 时,各方案的性能差距较小,但在到达1000万数量级为评估本文提出的基于协处理器的内存索引方案, 时,无索引的方案明显优于其他有索引方案。这是因为验证在构建二级索引时对数据库写入性能的影响和在随着数据量的增加,索引数据也越来越多,在进行索引构建了二级索引时对查询性能有怎样的提升。同时,实插入时也会相较500万条记录时更加困难。HiBase和验同样基于协处理器但使用内存构建索引(本文方案)本方案都是基于内存索引,在构建内存索引时,需要在与使用solr构建索引在查询性能上的表现,测试了数据协处理器中构建适合内存存储的索引结构,会消耗额外扩展性与集群扩展性。本文在主机上搭建了Hadoop集的计算资源。而基于solr的方案只需要在solr中构建二群、Zookeeper集群和HBase集群,为了与同样基于协处级索引,不需要在程序中进行额外计算。因此,HiBase理器的solr方案和HiBase方案进行比较,还搭建了solr和本方案相较基于solr的方案稍有劣势,但在一个可接集群。实验环境如表2所示。 受的范围之内。 表2 实验环境 4.3查询性能对比 实验在一台客户端上进行,数据源仍然是3000万 属性配置信息 CPUAMDRyzen71700XEight-Corerocessor八核 条数据,本次实验设置了4个测试用例。详情如下:查内存32GB 询河流站点水位值(STCD)在一定范围内的记录条数,硬盘三星MZVLW128CXB7(128GB/固态硬盘) 对水位值范围更改后即可得到不同的数据量。在水位操作系统Ubuntu16.4值属性上以建立HT树内存索引,对水位值进行范围查Java虚拟机Java1.8.0询,图9所示横坐标数据是4次测试用例所查询到的所Hadoop版本Hadoop2.2.0有结果数据量。进行30次测试,求得各数据库查询时HBase版本HBase1.2.0Zookeeper版本 Zookeeper3.4.10 间的平均值,结果如图9所示。 如图9所示,无索引的方案与其他有索引的方案性实验所用数据为某河流近3年各站点水位观测记能相比有很大差距,原因是,在原生的数据库中搜寻一录,属性包括ID、站点(STCD)、水位(RZ)、地区(RFROM)个特定值时,只能通过Scan的方式进行全表的扫描,效和时间(TM),共3000万条数据。 率极低,在数据量大时,这种查询方式可达几十个小时, 1042020,56(1)ComputerEngineeringandApplications计算机工程与应用NoindexHibase同时,本文选用了UCI数据集Abalone数据集,该数BasedonsolrBasedonmemory150据集符合非均匀分布,数据集可分为6类,并满足22.69%、29051011111127.53%、25.33%、19.46%、2.31%和2.68%的数据分布规nim100律,同时长度数据也满足非均匀分布性。为了满足大数/间时50据测试要求,将数据量以同等倍数增加,保证数据分布 231826592.........05.000010261312的不变性,查询数据集中Length为130和Length大于00241455413144212110小于130的数据,两种查询结果如图11所示。 数据量/万条1.5图9查询实验结果单值查询长度为20的范围查询1.101.15无法进行实际使用。同时,可以发现,无论查询出的结ni1.00.850.95果为多少,无索引的查询速度都在110min左右。排除m/间0.500.55误差影响,这是因为,无论结果如何,无索引的方案都要时0.5全表扫描,在每次扫描的数据量相同时,查询时间变化0.200.250.260.270.300.05不大。而本方案相比于同样构建了二级索引的基于solr0的方案,性能有较明显的提升,数据量大时,查询速度为0100200300400500600数据量/万条其3.5倍左右,与未构建索引的查询效率相比速度是其图11非均匀数据集查询性能50倍左右,与同样基于内存索引的HiBase方案提升了10%左右。本方案不仅在性能上优势巨大,随着查询结由图11可以看出,当数据量从0增加到600万时,果的增大时,查询所需的时间变化也较小,因为通过内由于数据的非均匀分布性,并未出现像均匀分布数据集中的线性增长趋势。这是由于单值查询和范围查询查存进行计算,计算速度快,并且都在索引上建立了索引询的目标数值普遍分布于数据表的前半段,在查询开始树结构,在关键字搜索时根据树结构搜索可以快速定时查询所得结果集较多,因此,查询时间增加较快。查位,数据量增大时,对速度影响也较小。 询数据量增多时,满足查询条件的记录条数减少,查询4.4扩展性实验 增加时间也随之变少,这也验证了内存索引方案良好的测试了基于协处理器的内存索引在不同规模数据 可扩展性。 下均匀与非均匀分布数据集查询性能。均匀分布数据同时,在3000万条数据的基础上,通过增加节点的集使用3000万条水文数据,单值查询河流站点水位值数量进行集群扩展性实验,由于节点的变化对单值查询(STCD)为62.20和范围查询水位值在60到65之间的记的性能影响可以忽略。因此,实验只对范围查询进行,录条数,结果如图10所示。实验结果如图12所示。 5单值查询4.14长度为20的范围查询4.04.54.03.9n3.73.6 i2.8m3n/2.33.4i3.5间2.0m/时2间3.33.2 时11.03.13.0 0.20.20.30.50.72.92.9 2.85 0500100015002000250030002.7数据量/万条2.5图10均匀数据集查询性能1 2 34 5 6 节点数量 可以看到,当数据的规模从0持续变化到3000万图12 节点数量变化对查询时间影响 级别时,查询的时间保持了线性增长,这也验证了基于可以看出,随着节点数量的增加,查询响应时间逐内存方案在数据的可扩展性方面有着良好的表现,查询渐减少。在进行范围查询时,会向所有节点发送查询响应时间和结果集大小成正比。因为在查询响应时间请求,因此,当节点数量增加时,相应的查询时间就会中,主要开销是对查询结果集的访问,在数据集中,数据变短。 是符合均匀分布的,随着数据行总数的增长,查询结果集也随之增加,因此,查询响应时间会与数据行总数大5结束语 小成正比。 为了提高HBase的查询性能,本文提出了基于协处 朱松杰,等:基于协处理器的HBase内存索引机制的研究2020,56(1)105 理器Coprocessor的方案,实现了内存索引的构建,并将二索引研究与实现[J].计算机应用,2014(S1):181-185.构建的内存索引持久化存储在外存中,通过实验达到了[5]崔晨,郑林江,韩凤萍,等.基于内存的HBase二级索引设 预期目标。其核心的思想为:通过协处理器构建内存索计[J].计算机应用,2018,38(6):1584-1590. 引,具体的内存索引结构为HT树索引,它可以极大提高[6]CaoC,WangW,ZhangY,etal.Leveragingcolumnfamily 索引的检索速度。同时,使数据表与索引文件协同分toimprovemultidimensionalqueryperformancein布,托管于同一台RegionServer,保证了数据表和索引HBase[C]//ProceedingsofInternationalConferenceon文件同时分布于集群中的同一台服务器上,在需要用到CloudComputing,2017:106-113. 索引文件时,直接将索引文件映射入内存,节约了时间。 [7]王文贤,陈兴蜀,王海舟,等.一种基于Solr的HBase海量 但本文还有一些不足,为了查询的简易性,对每一数据二级索引方案[J].信息网络安全,2017(8):39-44.个列值都创建了索引,这导致了构建的索引文件较为庞[8]周伟,刘希,陈浩.HBase分布式二级索引通用方案研究[J]. 大,降低了索引效率。同时,在内存中构建索引对象需软件导刊,2018(3):187-190. 要付出巨大的内存开销,当数量过大或索引内容过多[9]LiQ,LuY,GongX,etal.Optimizationalmethodof 时,集群中各服务器的内存会急剧消耗,有可能出现系hbasemulti-dimensionaldataquerybasedonhilbertspace-fillingcurve[C]//ProceedingsofInternationalCon-统瘫痪。 ferenceonP2P,2015:469-474. 综上所述,本文提出的索引方案实现了HBase检索[10]HuangJ,OuyangX,JoseJ,etal.High-performance 速度的提高,性能和稳定性也得到了充分的保证,但面designofHBasewithRDMAoverInfiniBand[C]//Pro-对大数据环境下各种各样的挑战,仍需要更多的努力去ceedingsofParallel&DistributedProcessingSympo-完善HBase的大数据处理方案。 sium,2012:774-785. [11]杨朝辉,王立松.pT-树:高速缓存优化的主存数据库索引 参考文献: 结构[J].计算机科学,2011,38(10):161-165. [1]白红军,夏俭,林晨.大数据时代数据存储技术的发展[J]. [12]邹敏昊.基于Lucene的HBase全文检索功能的设计与实 电子技术与软件工程,2017(4):174. 现[D].南京:南京大学,2013. [2]申德荣,于戈,王习特,等.支持大数据管理的NoSQL系统 [13]陈新鹏.基于HBase的数据生成与索引方法的研究[D]. 研究综述[J].软件学报,2013(8):1786-1803. 北京:北京邮电大学,2014. [3]葛微,罗圣美,周文辉,等.HiBase:一种基于分层式索引的 [14]宋华珠,段文军,刘翔.基于HBase的本体存储模型[J].计 高效HBase查询技术与系统[J].计算机学报,2016(1):算机科学,2016,43(6):39-43. 140-153. [15]王胜.持久化主存索引技术研究与应用[D].南京:南京航 [4]丁飞,陈长松,张涛,等.基于协处理器的HBase区域级第 空航天大学,2016. 因篇幅问题不能全部显示,请点此查看更多更全内容