基于MapDB构建的HBase数据检索方法与流程

文档序号:12598002阅读:561来源:国知局
本发明涉及一种数据库多字段查询方法,尤其涉及一种基于MapDB构建的HBase数据检索方法。
背景技术
::HBase是一个分布式的、面向列的开源数据库,它是利用HadoopHDFS作为其文件存储系统。随着HBase在性能和稳定性持续改善,HBase逐渐成为在大数据NoSQL领域的标准之一。在Hadoop之上提供了类似于Bigtable的能力,是Apache的Hadoop项目的子项目,其不同于一般的关系数据库而是一个适合于非结构化数据存储的数据库,另一个不同之处是HBase是基于列的而不是基于行的模式,以表的形式存储数据,表由行和列组成,列划分为若干个列族(rowfamily),如下表所示。与nosql数据库一样,rowkey是用来检索记录的主键。访问HBasetable中的行,只有三种方式:1、通过单个RowKey访问;2、通过RowKey的range;3、全表扫描。RowKey行键(Rowkey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),在HBase内部,rowkey保存为字节数组。目前HBase主要应用在结构化和半结构化的大数据存储上,其在插入和读取上都具有极高的性能表现,这与它的数据组织方式有着密切的关系,在逻辑上,HBase的表数据按RowKey进行字典排序,RowKey实际上是数据表的一级索引(PrimaryIndex),由于HBase本身没有二级索引(SecondaryIndex)机制,基于索引检索数据只能单纯地依靠RowKey,为了能支持多条件查询,开发者需要将所有可能作为查询条件的字段一一拼接到RowKey中,这是HBase开发中极为常见的做法,但是无论怎样设计,单一RowKey固有的局限性决定了它不可能有效地支持多条件查询。通常来说,RowKey只能针对条件中含有其首字段的查询给予令人满意的性能支持,在查询其他字段时,表现就差强人意了,在极端情况下某些字段的查询性能可能会退化为全表扫描的水平,这是因为字段在RowKey中的地位是不等价的,它们在RowKey中的排位决定了它们被检索时的性能表现,排序越靠前的字段在查询中越具有优势,特别是首位字段具有特别的先发优势,如果查询中包含首位字段,检索时就可以通过首位字段的值确定RowKey的前缀部分,从而大幅度地收窄检索区间,如果不包含则只能在全体数据的RowKey上逐一查找,由此可以想见两者在性能上的差距。由上可见,如何在确保非侵入的前提下,以高性能为首要目标,通过建立二级多列索引实现了对复杂条件查询的支持,成为HBase最受关注的研究方向。技术实现要素:本发明所要解决的技术问题是提供一种基于MapDB构建的HBase数据检索方法,能够方便地采用二级索引查询Hbase,快速匹配数据,大大提高查询性能。本发明为解决上述技术问题而采用的技术方案是提供一种基于MapDB构建的HBase数据检索方法,包括如下步骤:a)通过数据接口操作MapDB数据库进行数据读写操作;b)在数据写入HBase之前,先对数据进行格式化,生成Hbase的RowKey作为一级索引,并对数据分割相应字段,将用于查询的字段及其对应的RowKey写入MapDB数据库中作为二级索引;c)接着再将数据在MapDB数据库中按照HBase的表及列进行分类存储;d)采用二级索引查询HBase时,先通过查询字段在MapDB中获取对应的RowKey集合,再通过HBase提供的get方法进行数据查询。上述的基于MapDB构建的HBase数据检索方法,其中,所述步骤a)通过远程rmi接口操作MapDB数据库进行数据读写操作,所述远程rmi接口调用为采用java编程语言开发的实现远程对象之间无缝调用的数据接口。上述的基于MapDB构建的HBase数据检索方法,其中,所述步骤b)在写入HBase数据之前,每条入库数据均生成一个RowKey以及至少一个用于查询的字段,并将用于查询的字段通过rmi接口调用MapDB,将字段值及rowkey写入到MapDB中。上述的基于MapDB构建的HBase数据检索方法,其中,所述MapDB采用哈希表HashMap存储字段值及其对应的Hbase的RowKey,并将数据按照不同的业务存储到不同的MapDB中。上述的基于MapDB构建的HBase数据检索方法,其中,所述步骤c)中MapDB数据库采用HBase的表名作为获取HashMap的key值,采用HBase列作为HashMap中的键,并在HashMap里面存储RowKey集合。上述的基于MapDB构建的HBase数据检索方法,其中,所述MapDB采用文件存放方式将数据写入到本地磁盘进行持久化,并在JVM关闭时关闭文件流。上述的基于MapDB构建的HBase数据检索方法,其中,所述步骤d)通过HBase的客户端进行条件查询时,先通过rmi调用MapDB进行查询获取RowKey,再通过HBase提供的get方法获取数据。上述的基于MapDB构建的HBase数据检索方法,其中,所述步骤b)中每条入库数据格式化生成RowKey后,按照分隔符进行分割,并将用于后续查询的字段及字段值拼接进来,写入List集合中;所述步骤c)调用MapDB的写入接口将RowKey、HBase表名及List集合传递过去,写入MapDB数据库中;所述步骤d)采用二级索引进行数据查询时,将查询条件按照入库时的拼接方式将字段及字段值进行拼接,写入List集合中,并远程rmi接口调用MapDB的查询接口将HBase表名及List集合传递过去,获取相应的RowKey集合,返回结果为List<String>集合,并通过字节流的方式返回到HBase的客户端,所述HBase的客户端采用HTable的get方法,直接将整个List<String>集合作为参数进行数据检索。上述的基于MapDB构建的HBase数据检索方法,其中,所述HBase的客户端接收到MapDB服务器返回的RowKey集合后,判断RowKey集合是否存在数据,不存在的则直接返回;如果RowKey集合中存在数据,首先遍历该RowKey集合获取所有的RowKey,构造GET对象并写入到该RowKey集合中,然后通过HBase的批量GET方法获取HBase数据。上述的基于MapDB构建的HBase数据检索方法,其中,还包括查询HBase时,如果查询字段中包含一级索引RowKey中的首位字段,则直接通过Scan设置StartKey和EndKey参数后进行数据查询。本发明对比现有技术有如下的有益效果:本发明提供的基于MapDB构建的HBase数据检索方法,在数据写入HBase之前,先对数据进行格式化并分割相应字段,将用于查询的字段及其对应的RowKey写入MapDB数据库中作为二级索引,从而能够方便地采用二级索引查询Hbase,快速匹配数据,大大提高查询性能。附图说明图1为本发明基于MapDB构建的HBase数据检索流程示意图;图2为本发明使用的MapDB数据库的结构导图;图3为本发明数据写入HBase的流程图;图4为本发明HBase数据查询的流程图。具体实施方式下面结合附图和实施例对本发明作进一步的描述。图1为本发明基于MapDB构建的HBase数据检索流程示意图。请参见图1,本发明提供的基于MapDB构建的HBase数据检索方法,包括如下步骤:步骤S1:通过数据接口操作MapDB数据库进行数据读写操作;步骤S2:在数据写入HBase之前,先对数据进行格式化,生成Hbase的RowKey作为一级索引,并对数据分割相应字段,将用于查询的字段及其对应的RowKey写入MapDB数据库中作为二级索引;步骤S3:接着再将数据在MapDB数据库中按照HBase的表及列进行分类存储;步骤S4:采用二级索引查询HBase时,先通过查询字段在MapDB中获取对应的RowKey集合,再通过HBase提供的get方法进行数据查询。本发明使用Java远程消息交换协议JRMP(JavaRemoteMessagingProtocol)进行通信,构建MapDB提供数据操作服务器。在数据写入HBase数据库之前,生成HBase的RowKey,并将需要用于查询的字段及对应的值发送到MapDB提供的接口中,MapDB按照字段名为索引构建一个Map结构的存储,将字段的值及对应的HBase的RowKey存储到Map结构中。如果字段值已经存在的,则将新的RowKey加入到原有的队列中,并写入硬盘中。在MapDB中存储完成后,按照HBase原有的API将数据写入HBase中。MapDB中采用Hash存储,将对应的字段值Hash分散,在进行数据匹配时可以达到最快的匹配速度。对于数据量比较的大可以按照不同的业务存储到不同的MapDB中,提高MapDB的操作速度。在进行HBase条件查询时,对应满足RowKey设计规则的查询,则直接通过RowKey进行查询,对于不满足RowKey规则的,则在进行查询是,将需要查询的表名、字段及字段值。发送到MapDB提供服务的接口中。MapDB通过表名及字段名获取存储对应的Map数据表,在从数据表中根据字段值进行检索获取RowKey的集合并返回客户端,客户端在接收到RowKey集合后,根据RowKey进行Get操作,从HBase数据库中获取数据。以此到达最快的查询性能。由于在HBase数据库查询中,GET查询速度是最快的,因为GET查询是直接通过RowKey到对应的META表中获取Region。并快速获取到该Region中RowKey对应的值。本发明具备多条件查询优化方法并具备快速获取RowKey的能力,通过MapDB数据库能提供远程调用功能,并实现MapDB数据库的按照条件的规则进行数据写入及数据查询,达到优化的目的。MapDB数据库具备快速数据写入及查询,且MapDB是不需要安装的只需要jar包即可使用,所有的数据都是暂时缓存在内存中,写入磁盘上,在内存的查询速度上远远高于在磁盘上做查询。通过字段值构造RowKey的倒排索引以到达最快的RowKey查询。提高了多条件查询的效率,为多条件查询提供了优化的方法;该方法的条件查询过程较为简洁,且无需安装,因此更为高效,实用性强,易于推广。本发明属于一种基于MapDB构建HBase二级索引的方法。主要涉及MapDB数据库的远程服务、MapDB数据库存储设计、查询时方案设计三方面。本发明将所有入库HBase的数据对应RowKey及需要查询的字段写入集中式的MapDB数据库,满足分布式入库的需求,按照查询字段进行分组,存储到对应的集合中,并将字段值进行Hash分组,对应的RowKey进行倒排索引存储。为HBase表的多条件查询做好优化准备。在客户端进行多条件查询时,先通过MapDB的服务接口获取该条件的RowKey集合,在通过RowKey集合进行GET查询,减少全表数据扫描,提高查询性能,达到优化效果。具体实施过程如下:1、编程实现远程服务,在服务端实现MapDB数据库的存储。存储结构上根据字段名称作为HashMap表的Key值,可以通过该Key值获取对应的HashMap表的存储位置及数据。字段值作为HashMap表的Key值,而对应的RowKey则采用集合的方式存储到HashMap表对应的Value。通过HashMap的快速Key值匹配,提高多字段查询的获取的RowKey的性能。编程实现远程服务,在服务端实现MapDB数据库的查询,接收客户端传递过来的字段及字段值。通过字段名获取对应的HashMap表,在根据在字段值获取对应的RowKey集合,并返回客户端。2、客户端在写入HBase表前,先将数据进行格式化,生成RowKey及分割相应的字段。每条入库数据会生成一个RowKey及多个用于查询的字段。并将RowKey及字段、字段值通过MapDB的服务接口,写到到MapDB数据库中。写入方式采用上述的方法进行。保证达到优化的效果3、在多条件查询数据时,将字段及字段值通过MapDB的服务接口,调用其查询方法获取字段条件对应的RowKey集合,在用这个RowKey集合调用HBase的GET方法进行数据查询。本发明的详细优化步骤如下:1、首先使用Java远程消息交换协议JRMP(JavaRemoteMessagingProtocol)进行通信,构建MapDB提供数据操作服务,并在服务器上注册TCP端口。然后启动该服务,确保其他的服务器可以通过服务器地址+端口号+服务名进行接口调用。并进行正常的数据传输。数据写入HBase之前,通过MapDB服务器的服务器地址+端口+服务名获取MapDB服务器的接口。将数据按照分割符进行拆分,按照最常用的查询方式生成RowKey。并将可能用于查询的字段名及字段值用”#”进行连接,并放入集合中。并按照RowKey值作为key,集合做Value放入到Map中。以批量的方式将这些数据和HBase表名通过MapDB的接口调用它的写入方法。MapDB服务器的写入方法接收到数据后,将数据集进行遍历获取RowKey、字段名、字段值。通过字段名获取HashMap集合,获取到HashMap集合后,首先使用字段值到HashMap集合中匹配是否已经存在相应的字段值,存在则将本次的RowKey加入到集合中,不存在的则创建集合将本次RowKey写入到集合中,并将该集合写入到HashMap集合中。并定时写入磁盘中。持久化数据,确保数据不会出现丢失。比如新建一个用于提供服务的接口类实,并继承Remote这个类实现远程调用过程。Remote是JAVA程序自带的类,具体类路径java.rmi.Remote。接口类中定义写入及查询两个方法。在实现类的实现上述接口,并覆写上述的写入及查询接。该实现必须继承UnicastRemoteObject这个类,UnicastRemoteObject是有JAVA自带的程序提供,具体的类路径是:java.rmi.server.UnicastRemoteObject。在写入方法中,首先通过参数HBase表名获取MapDB的存储接口。利用字段名称获取HashMap表,并将字段值作为key,RowKey集合作为value写入HashMap表中,对于多个字段的则循环上述内容,最后将数据提交至MapDB数据库中。2、根据用户程序指定的查询条件,查询条件满足RowKey设计规则,则直接通过Scan中的参数设置,设置StartKey和EndKey进行数据查询,对于不满足该设计条件的,获取MapDB服务的接口。并将查询条件作为参数调用接口的查询方法。查询方法中通过参数HBase表名获取MapDB的存储接口。利用字段名称获取HashMap表,并通过字段值在HashMap表中获取对应的RowKey集合,对应多个字段查询,则循环执行上述内容。最后将多个RowKey集合结合获取交集部分返回客户端。3、进行数据入库时,首先格式化数据,每条数据生成RowKey,按照分隔符进行分割,并将用于后续查询的字段及字段值拼接进来,写入List集合中。接着调用MapDB的写入接口,将RowKey、HBase表名及List集合传递过去,写入MapDB数据库中。MapDB服务器的查询方法接收到参数后,按照HBase表名和字段名获取MapDB数据库中对应的HashMap集合。在通过字段值到HashMap集合获取RowKey集合,并将该集合返回给客户端。也就是说,进行数据查询时,将查询条件按照入库时的拼接方式将字段及字段值进行拼接,写入List集合中,并调用MapDB的查询接口,将HBase表名及List集合传递过去,获取相应的RowKey集合,通过该RowKey集合调用HBase的查询方法,进行数据检索。4、客户端接收到MapDB服务器返回的RowKey集合后,判断RowKey集合是否存在数据,不存在的则直接返回。RowKey集合中存在数据的,首先遍历该集合获取所有的RowKey,构造GET对象,并写入到集合中。通过HBase的批量获取GET的方法,通过该集合获取HBase的数据,至此整个查询结束。此外,通过MapDB数据库获取到相应的RowKey集合在进行查询时,可以根据HBase中的相关读操作的参数配置,如caching设置大一些有利于读。Batch设置大一些有利于一次可以抓取多条数据,通过这些参数的合理设置可以提高性能,达到优化的目的。本发明的具体实施操作过程如下:1、首先部署分布式集群环境,该集群中的硬件环境是10台服务器,每台服务器是64G内存,CPU采用4个Intel(R)Xeon(R)CPUE5-2630v2@2.60GHz,硬盘是6*1T,操作系统是Centos6.5。按照官方文档在服务器中安装Hadoop组件。然后将HDFS、Zookeeper及HBase按照正常顺序开启服务。本实例中源数据的格式是1451011513,332,30,2bbb1935567cac4f2bbb1934567cac4f,899,88第一列是时间(秒),第二列是毫秒,第三列是设备编号,第四列是数据ID,第五列是厂商编号,第五列是位置编号。条件查询是指给定设备编号或厂商编码或位置编号,查找在满足这些条件的所有信息,源数据有100亿条数据,提高查询效率是必要的。经过分析。因为查询的条件是任意不固定的,所以单从RowKey设计上进行查询优化是无法满足性能要求的,必须查询二级索引的方案来提升查询性能,采用MapDB数据库作为二级索引的数据存储,不在RowKey的查询范围内的都通过MapDB数据库构建二级索引,通过MapDB数据库获取不同的查询字段及对应的RowKey,达到优化的结果。2、再挑选其中一台主节点服务器作为MapDB数据库提供服务的服务节点,将已经实现RMI服务的程序部署到该节点上,并启动注册服务,注册端口为2007,该端口号可以根据实际情况进行调整,集群上的其他服务器可以通过这个节点的ip、端口号及服务名去调用MapDB数据库的服务。MapDB数据库的数据操作如图2所示。在实例化MapDB是采用newFileDB的这种方式,这种方式可以将数据持久化到本地磁盘上,另外需要设置closeOnJvmShutdown方法,保障在JVM关闭的时候才关闭MapDB数据库,而MapDB数据库在此采用HashMap的存储方式,不需要采用TreeMap的结构,因为不需要对数据进行排序且数据更加离散在进行数据检索时达到更好的效果。每批数据写入MapDB数据库后,都需要调用commit的方法,将数据写入到本地磁盘进行持久化,保障数据的安全可靠性。3、客户端导入数据时,将数据进行格式化,选用设备编号作为RowKey,厂商编号、位置编号则采用二级索引的方式进行存储。整体数据入库流程如图3所示,将数据按照每10000条作为一批数据,每批数据入库HBase之前调用MapDB数据库的服务接口,将RowKey、厂商编号、位置编号作为参数传递到该接口上。确认节点调用成功后,将数据写入HBase中,所有的数据存储为一个列,减少IO的压力。达到更快的入库性能。4、在优化查询时,如图4所示,首先是客户端获取查询条件时从条件上判断是否是设备编号的查询,如果是只需调用HBase的scan方法,然后设置StartKey和EndKey。使用HTable的getScanner方法进行进行获取数据,客户端与regionserver通信一次,会找到regionserver的region,并扫描region返回一定数据。这个数据量是由scan的Batch指定的。而caching的作用就是通信一次找到region,调用扫描caching次,也就是说用这两个参数的话,一次通信可以返回的数据为caching*batch条,显然这会减少客户端和rs的通信量。5、在所有非设备编号查询中,先提取查询条件,调用MapDB数据库的服务接口,获取RowKey集合,返回结果为List<String>集合,通过字节流的方式返回到客户端。客户端采用HTable的get方法,直接将整个集合作为参数,而不采用遍历集合在进行查询,这样可以减少RPC的请求次数,进而提升查询的性能。在查询过程中,客户端采用静态变量的方式保存MapDB数据库的服务接口,不需要每次入库都需要重新去获取该服务接口。虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范围当以权利要求书所界定的为准。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1