一种基于HBase数据库的数据批量入库的方法和装置与流程

文档序号:13219377阅读:249来源:国知局
技术领域本发明涉及HBase数据库技术领域,具体涉及一种基于HBase数据库的数据批量入库的方法和装置。

背景技术:
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库,HBase不同于一般的关系型数据库,它是一个适合于非结构化数据存储的数据库,利用HBase可以在廉价的PCServer上搭建起大规模结构化存储集群,能有效的降低大数据化背景下的存储成本。但HBase在数据批量入库方面存在一个问题,通过HBase自身提供的入库工具对大批量的数据进行入库时十分缓慢耗时、效率极低,例如,一个上百G的数据文件入库时通常要耗时23-24个小时,甚至更长时间。其批量入库步骤大致如下:1、先将数据文件通过Importtsv工具按分区并行生成为HBase的底层存储文件HFile文件。在此步中极易出现数据倾斜,即由于每个分区都会有范围,在分区范围设计不合理时导致大量的数据过度集中到某一个分区中,从而导致此分区在计算过程中十分缓慢,降低整体运行速度。2、将生成好的HBase底层存储文件HFile文件通过BulkLoad工具批量导入到HBase表中。该步骤中很容易出现HFile文件跨分区,即一个HFile文件中的数据一部分属于A分区范围另一部分数据属于B分区范围,因为HBase底层是通过分区对这些HFile文件进行管理的,一旦生成好的HFile文件出现跨分区,在导入的过程中将再次对此文件进行复制分割,复制分割过程十分耗时,从而大大降低了整体的入库效率。上述两个步骤中所存在的问题严重限制了HBase批量入库效率的提高,使得整个数据入库过程缓慢、耗时较长。

技术实现要素:
本发明提供了一种基于HBase数据库的数据批量入库的方法和装置,以解决现有的HBase数据库数据批量入库耗时长,效率低的问题。根据本发明的一个方面,提供了一种基于HBase数据库的数据批量入库方法,该方法包括:对待入库的源数据,提取行键并排序,将排序后的行键按指定的分区个数进行平均分区,确定出每个分区范围的端值对应的行键;将每个分区范围的端值对应的行键,分别增加预定长度后作为每个预建分区范围的端值;判断所述HBase数据库中是否存在HBase表;如果否,在HBase数据库中创建HBase表,并在HBase表中根据每个预建分区范围的端值建立分区;对待入库的源数据按照HBase表中建立的每个分区,并行生成对应的HFile文件;将生成的HFile文件批量导入HBase表中。其中,该方法还包括:如果是,从已有HBase表中提取每个已有分区范围的端值;根据每个预建分区范围的端值和已有分区范围的端值进行排序处理,得到每个新建分区范围;对待入库的源数据按照每个新建分区范围,并行生成对应的HFile文件;将生成的HFile文件批量导入已有的HBase表中。其中,根据每个预建分区范围的端值和已有分区范围的端值进行排序处理,得到每个新建分区范围包括:对每个预建分区范围的端值和已有分区范围的端值进行排序;由排序后的相邻的每两个端值确定出一个新建分区范围。其中,将生成的HFile文件批量导入HBase表中包括:根据已有Hbase表中每个已有分区范围的端值,将新建分区范围属于该已有分区范围内所生成的HFlie文件对应导入该已有分区里。其中,对待入库的源数据按照每个新建分区范围,并行生成对应的HFile文件包括:将每个新建分区范围分别生成一个分区文件,通过修改Importtsv工具的源码,将生成的分区文件传递给TotalOrderPartitioner类,再通过此修改后的Importtsv工具并行生成对应的HFile文件。其中,对待入库的源数据,提取行键并排序包括:对待入库的源数据,提取全部的行键并排序;或者,对待入库的源数据,提取部分的行键并排序。根据本发明的另一个方面,提供了一种基于HBase数据库的数据批量入库装置,该装置包括:分区范围确定单元,用于对待入库的源数据,提取行键并排序,将排序后的行键按指定的分区个数进行平均分区,确定出每个分区范围的端值对应的行键;预建分区范围的端值确定单元,用于将每个分区范围的端值对应的行键,分别增加预定长度后作为每个预建分区范围的端值;HBase表判断单元,用于判断HBase数据库中是否存在HBase表;分区建立单元,用于在HBase表判断单元判断HBase数据库中不存在HBase表时,在HBase数据库中创建HBase表,并在HBase表中根据每个预建分区范围的端值建立分区;HFile文件生成单元,用于对待入库的源数据按照HBase表中建立的每个分区,并行生成对应的HFile文件;HFile文件导入单元,用于将生成的HFile文件批量导入HBase表中。其中,该装置还包括:新建分区范围确定单元,用于在HBase表判断单元判断HBase数据库中存在HBase表时,从已有HBase表中提取每个已有分区范围的端值;根据每个预建分区范围的端值和已有分区范围的端值进行排序处理,得到每个新建分区范围;HFile文件生成单元,用于对待入库的源数据按照每个新建分区范围,并行生成对应的HFile文件;HFile文件导入单元,用于将生成的HFile文件批量导入HBase表中。其中,新建分区范围确定单元,具体用于对每个预建分区范围的端值和已有分区范围的端值进行排序;由排序后的相邻的每两个端值确定出一个新建分区范围。其中,HFlie文件导入单元,用于根据已有Hbase表中每个已有分区范围的端值,将新建分区范围属于该已有分区范围内所生成的HFlie文件对应导入该已有分区里。本发明的这种基于HBase数据库的数据批量入库的方法和装置,通过提取待入库的源数据行键并按照指定的分区个数进行平均分区,避免了生成HFile文件过程中出现数据倾斜问题,通过将每个分区范围的端值对应的行键分别增加预定长度后作为每个预建分区范围的端值,使得用于建表的分区范围的端值长度大于行键的长度,以此避免生成的HFile文件跨分区的问题,由此提高了HBase数据库中的底层HFile文件的生成速度以及HFile文件的入库速度,从而使得HBase批量入库效率得到极大的提升。附图说明图1是本发明一个实施例提供的一种基于HBase数据库的数据批量入库方法流程图;图2是本发明另一个实施例提供的一种基于HBase数据库的数据批量入库方法流程示意图;图3是本发明一个实施例提供的一种基于HBase数据库的数据批量入库方法中分区范围交叉处理示意图;图4是本发明一个实施例提供的一种基于HBase数据库的数据批量入库装置的框图。具体实施方式本发明的核心思想是:针对现有HBase数据中的制约HBase数据库批量入库的关键环节,通过采用对待入库的源数据提取行键并按指定的分区个数进行平均分区,对数据的分区范围进行有效的划分,避免生成HFile文件过程中出现数据倾斜和跨分区的问题。图1是本发明一个实施例提供的一种基于HBase数据库的数据批量入库方法流程图,参见图1,在HBase数据库中未有HBase表时,本发明的这种数据批量入库方法包括:步骤S110,对待入库的源数据,提取行键并排序,将排序后的行键按指定的分区个数进行平均分区,确定出每个分区范围的端值对应的行键;其中,行键是Hbase数据库在数据入库时对每条数据设计的标识,例如,待入库的源数据如下:abef,1ewew,df;aaxe,5sfd,3wesdd;xrty,9dsdw,32dd;在这3条待入库源数据中提取第一列的数据abef、aaxe、xrty分别作为每条数据的行键;在数据入库时必须对行键进行排序,才能将数据按从小到大顺序入库到Hbase数据库中,这是因为Hbase数据库要求入库的数据是按行键进行有序排列的,排列原则为按自然顺序排列,如以上abef、aaxe、xrty三个行键按从小到大排序后为:aaxe、abef、xrty;另外,这里端值指的是一个分区的边界值,例如,将待入库源数据排序后的行键为123、3se、4ad、5dw分成2个分区,从无穷小到3se为一个分区,3se到无穷大为一个分区,这时的3se即为分区范围的端值所对应的行键。步骤S120,将每个分区范围的端值对应的行键,分别增加预定长度后作为每个预建分区范围的端值;这里的行键就是从待入库源数据中抽取出来的行键,即在原行健长度的基础上增加一位长度后得到的数据作为每个预建分区范围的端值,例如,在步骤S110例子中得到了一个分区范围对应的行键是3se,增加一位长度后变成3se1,作为该预建分区范围的端值。也可以在原行健长度的基础上增加多位。步骤S130,判断所述HBase数据库中是否存在HBase表;如果否,执行步骤S140;步骤S140,在HBase数据库中创建HBase表,并在HBase表中根据每个预建分区范围的端值建立分区;步骤S150,对待入库的源数据按照HBase表中建立的每个分区,并行生成对应的HFile文件;即对待入库的每条数据在变成Hfile文件过程中都会去对比分区范围,然后确定应该放在哪个分区范围中,最后将各个分区范围中所包含的数据变成Hfile文件,Hfile是HBase中KeyValue数据的存储格式,为二进制格式数据。步骤S180,将步骤S150生成的HFile文件批量导入HBase表中。即先按交叉处理排序后所得的分区范围进行生成Hfile文件,然后得到这些分区范围所对应的Hfile文件,再将这些Hfile文件对号入座放入Hbase表中。在本实施例中,该方法还包括:如果是,执行步骤S160,从已有HBase表中提取每个已有分区范围的端值;根据每个预建分区范围的端值和已有分区范围的端值进行排序处理,得到每个新建分区范围;步骤S170,对待入库的源数据按照每个新建分区范围,并行生成对应的HFile文件;步骤S180,将步骤S170生成的HFile文件批量导入已有的HBase表中。经过上述过程,在HBase数据库中确定分区范围并建立分区,再将待入库的全部数据根据确定好的分区范围生成对应HFile文件,以及对新增数据,根据新增数据确定的分区范围和HBase表中已有的分区范围进行交叉处理,并确定出新建分区范围,生成对应的HFile文件;将生成好的HBase底层存储文件HFile文件通过BulkLoad工具批量导入到HBase表中实现了数据快速批量入库。通过对待入库的数据按照行键进行排序,确定出分区范围,避免了大量的数据过度集中在某一个分区上,从而解决了在由分区范围生成HBase文件时出现的数据倾斜问题,此外,通过将分区范围端值对应的行键长度增加预定长度,避免了在通过Importtsv工具生成HFile文件再导入HBase数据库时,由于行键和分区范围的端值长度相等,HFile文件会出现跨分区而需要重新进行分区的问题。综上,该方法能够大大提高数据批量入库的效率,缩短HBase数据库中数据批量入库的时间。图2是本发明另一个实施例提供的一种基于HBase数据库的数据批量入库方法流程示意图,图3是本发明一个实施例提供的一种基于HBase数据库的数据批量入库方法中分区范围交叉处理的示意图。下面结合图2和图3来具体说明本发明的这种数据批量入库方法的工作过程。本实施例中,为了实现HBase快速批量入库将待入库的源数据分以下两种情形来进行具体说明:A)、数据第一次批量入库HBase表(即HBase表还没有建立)对待入库的源数据的行键进行抽样排序(即提取部分的行键进行排序),并根据指定的分区个数将抽样排序的行键进行平均分区,确定出每个分区范围的端值对应的行键。参见图2,由于数据是第一次入库HBase表,在进行处理时先通过MapReduce对待入库的源数据行键进行抽样排序,按指定的分区个数对提取出的行键进行平均分区,从而获得各个分区范围的端值对应的行键,根据确定出的每个分区范围的端值对应的行键,在各个分区范围的端值对应的行键基础上增加一位或多位得到预建分区范围的端值,根据预建分区范围的端值在HBase数据库中创建HBase表并在HBase表中建立分区;对待入库的源数据按照HBase表中建立的每个分区,通过Importtsv工具并行生成对应的HFile文件,此时Importtsv工具会去读取HBase表中预先建立的分区范围去对全部待入库的源数据进行分区;将生成的HFile文件批量导入HBase表中,从而有效避免了在数据批量入库,将待入库的源数据生成HFile文件时发生数据倾斜问题。需要说明的是,在根据待入库的源数据利用MapReduce对分区的范围进行划分时,也可以采用全部的数据按照行键排序(即提取全部的行键),按指定的分区个数对全部行键进行平均分区,从而获得各个分区范围的端值对应的行键。在本实施例中,根据确定出的每个分区范围的端值对应的行键,在HBase数据库中创建HBase表并在HBase表中建立分区包括:将每个分区范围的端值对应的行键的长度分别增加预定长度作为预建分区的端值。一般情况下,只需要将抽样出的行健的长度增加一位作为预建分区范围的端值的长度即可,也可以将分区范围对应的行键长度增加多位得到的长度作为预建分区范围的端值的长度,只要保证预建分区范围的长度大于行键的长度,以此避免生成HFile文件时,分区范围长度和数据行键长度相等而导致的在利用BulkLoad工具导入HFile文件时出现HFile文件跨分区问题。B)、新增数据入库HBase表(即HBase表已存在并已存在数据)在HBase数据库中已有HBase表和数据的情况下,新增待入库的源数据;对待入库的源数据行键进行抽样排序并根据指定个数的分区进行平均分区,确定出每个分区范围的端值对应的行键,将每个分区范围的端值对应的行键,分别增加预定长度后作为每个预建分区范围的端值。参见图2,步骤1、为了防止新增待入库的源数据在数据批量入库时再次发生数据倾斜和生成的HFile文件跨分区的问题,在对新增待入库的源数据进行批量入库时,也要先通过MapReduce对新增数据行键进行抽样排序,按指定的分区个数对提取出的行键进行平均分区,从而获得各个分区范围的行键,然后对这些行键长度分别增加一位或多位,得到预建分区范围的端值,保证预建分区范围端值的长度和HBase表中已有分区范围端值的长度相等;步骤2、从HBase表中提取出已有分区范围的端值和每个预建分区范围的端值进行排序处理,得到每个新建分区范围;具体地,对每个已有分区范围的端值和每个预建分区范围的端值进行排序;由排序后的相邻的每两个端值确定出一个新建分区范围,该方式称为分区范围交叉法。分区范围的交叉处理如图3所示,例如,Hbase表中已经由端值无穷小、X1,X2和无穷大确定出了三个已有分区范围以及由无穷小、Y1,Y2和无穷大确定出了三个预建分区范围。图3中第一排范围(即已有分区范围)代表HBase数据库中已有的分区范围;第二排范围代表(即预建分区范围)对新增待入库的源数据的行键进行抽样排序,按照指定的分区个数进行平均分配,确定出每个分区范围的端值对应的行键,将每个分区范围的端值对应的行键,分别增加预定长度后作为每个预建分区范围的端值,从而确定出的预建分区范围,将已有分区范围与预建分区范围的端值进行排序,由排序后的相邻的每两个端值确定出一个新建分区范围。其中,将已有分区范围与预建分区范围的端值进行排序的过程就是对由端值确定出的各个已有分区范围与预建分区范围进行交叉处理的过程。参见图3,第一已有分区的左端值是无穷小,右端值是X1;第二已有分区的左端值也是X1,右端值是X2;第三已有分区的左端值也是X2,左端值为无穷大;第一预建分区的左端值是无穷小,右端值是Y1;第二预建分区的左端值也是Y1,右端值是Y2;第三预建分区的左端值也是Y2,左端值为无穷大;根据交叉排序法,对上面得到的分区范围的六个端值进行排序(无穷小→X1→Y1→X2→Y2→无穷大),由排序后的相邻的每两个端值确定出一个新建分区范围。即新建分区范围中1区的范围是{无穷小,X1
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1