一种基于HFile批量加载数据的方法

文档序号:10624768阅读:305来源:国知局
一种基于HFile批量加载数据的方法
【专利摘要】本发明提供了一种基于HFile批量加载数据的方法,通过预分分区Region,形成多个分区Region,避免了现有技术中Region分裂过程时间过长的问题;在此基础上,在Map阶段生成HFile文件,避免了Reduce过程,提高了效率;并且,由于在Map阶段就成功生成了HFile文件,因此每生成一个HFile文件后可以保存该文件,避免MapReduce任务失败后,所有的中间结果都被删除的问题,进一步提高了HFile文件记载效率。
【专利说明】
-种基于HFi le批量加载数据的方法
技术领域
[0001] 本发明设及数据处理技术领域,尤其设及一种基于HFile批量加载数据的方法。
【背景技术】
[0002] 随着网络技术的飞速发展,数据量的急速增长,为了分析和利用运些庞大的数据 资源,传统的技术已然遇到了巨大的障碍,无法胜任大数据分析的任务。而为了满足大数据 分析的要求,Google提出了 MapRe化ce (映射化简)技术,它是一种面向大规模数据分析处 理和并行计算的编程模型。
[0003] 皿ase化adoop Dat油ase)是一个高可靠性、高性能、面向列、可伸缩的分布式存储 系统,皿ase可W作为MapRe化ce的数据来源和数据目的地,从而使得MapRe化ce能够处理 皿ase中保存的数据或者将输出数据保存在皿ase中。
[0004] 当皿ase作为MapRe化ce的数据目的地时,可采用皿ase中自带的数据导入工具, 但是由于皿ase中自带的数据导入工具有一定的局限性,它不能使用户完全控制数据加载 过程,并且不能自定义数据加载的预期格式。因此,加载具有特定格式的皿ase加载数据的 导入方法是非常重要的。 阳〇化]目前批量加载数据到皿ase数据库最高效的方式如CN20131058470. 2公开的一种 皿ase加载数据的导入方法,其首先根据实际数据对皿ase表的Region (分区)进行预分, 然后编写MapRe化ce程序将源数据转换为HFile文件,每个Region对应一个HFile文件, 最后利用completebu化load命令将HFile文件加载到皿ase。上述方法可W将生成好的 HFile文件直接加载进运行中的皿ase集群,减少了在数据迁移过程中数据传输的网络流 量,提高了数据导入效率,节省CPU和网络资源。
[0006] 但上述方法存在W下Ξ点不足之处:
[0007] 首先,皿ase表创建时默认只有一个Region,数据加载时首先进入此Region, 当数据量达到一个阔值时会被分裂成两个Region,分裂的Region会分布到其他的 RegionServer,W保证集群的负载均衡,但是Region的分裂是一个耗时的过程,会导致数 据加载时的效率低下。
[0008] 其次,通过MapRe化ce生成HFile文件,由于HFile文件必须是按字典序排列的, 因此必须首先通过Map (映射)过程将所有数据写到临时文件,然后在Re化ce (化简)过程 从临时文件读取数据进行排序,生成HFile文件,此过程非常耗时。
[0009] 再者,通过MapRe化ce生成HFile文件的过程中,如果Map阶段任务失败,生成的 临时文件会被删除,数据加载需要重新开始;如果Re化ce阶段任务失败,生成的HFile文件 会被删除,数据加载仍需要重新开始。

【发明内容】

[0010] 鉴于现有技术的上述缺陷,本发明提供了一种基于HFile批量加载数据的方法, W进一步提高数据加载的效率。
[0011] 本发明采用的技术手段如下:
[0012] 一种基于HFile批量加载数据的方法,包括:
[0013] 预分分区Region,形成与HFile文件--对应的多个分区Region ;
[0014] 读取源数据记录,分别确定每一条源数据记录需写入的HFile文件,并将源数据 记录写入其对应的HFile文件;
[0015] 对已完成源数据记录写入的HFile文件加载至其对应的分区Region。
[0016] 进一步,读取源数据记录,分别确定每一条源数据记录需写入的HFile文件,并将 源数据记录写入其对应的HFile文件包括:
[0017] 读取源数据记录,分别确定每一条源数据记录对应的HFile文件的文件名;
[0018] 根据所述文件名将源数据记录向各自对应的多个HFile文件写入。
[0019] 进一步,将源数据记录写入其对应的HFile文件后,将所述HFile文件存储到自定 义目录。
[0020] 进一步,预分分区Region,形成与HFile文件--对应的多个分区Region包括:
[0021] 预分分区Region,形成行主键RowK巧自增的多个分区Region。
[0022] 进一步,所述预分分区Region,形成行主键Rowlfey自增的多个分区Region包括:
[0023] 根据源数据的总数据量确定预分分区Region个数及大小;
[0024] 采用源数据中自增的ID作为分区Region的行主键Rowlfey。
[00巧]进一步,读取源数据记录,分别确定每一条源数据记录对应的HFile文件的文件 名包括:
[00%] 在map的setup方法中获取所有分区Region的起始键值StartKey和终止键值 化化巧,生成起始键值StartK巧和终止键值化化巧集合,并定义en化巧变量;
[0027] 读取一条源数据记录后,判断en化ey变量的值是否为空;
[0028] 若判断结果为emlKey变量的值为空,则判断当前读取的源数据记录中的所述自 增的ID是否在某个Region的起始键值StartKey和终止键值化化ey之间,如果当前读取的 源数据记录中的所述自增的ID处于某个Region的起始键值StartKey和终止键值化化ey 之间,则将当前读取的源数据记录中的en化ey变量赋值为该Region的终止键值化化ey,并 判断当前读取的源数据记录中的所述自增的ID是否等于emlKey变量的值; 阳029] 若当前读取的源数据记录中的所述自增的ID等于en化ey变量的值,则说明当前 读取的源数据记录已不属于该Region而属于该Region的下一个Region,将en化ey赋值更 新为该Region的下一个Region的化化巧,由此获得与该Region的下一个Region对应的 HFile文件的文件名。
[0030] 进一步,若判断结果为emlKey变量的值不为空,则判断当前读取的源数据记录中 的所述自增的ID是否等于emlKey变量的值; 阳031] 当前读取的源数据记录中的所述自增的ID不等于en化ey变量的值,则说明当前 读取的源数据记录属于该Region,由此获得与该Region对应的HFile文件的文件名。 [0032] 进一步,在获得HFile的文件名后,对当前读取的源数据记录中的Ke^alue进行 排序。 阳033] 进一步,所述对当前读取的源数据记录中的Ke^alue进行排序包括:
[0034] 定义一个K巧Value的排序集合;
[0035] 将当前读取的源数据记录中的KeyValue存放到所述排序集合中完成排序。
[0036] 进一步,将该条源数据记录写入其对应的HFile文件包括:
[0037] 调用map方法中的write方法,添加所述HFile的文件名; 阳03引利用write方法解析HFile的文件名;
[0039] 判断该HFile的文件名对应的文件对象是否存在,若该HFile的文件名对应的文 件对象不存在则根据该HFile的文件名创建文件对象,并将当前读取的源数据记录写入文 件对象;
[0040] 若该HFile的文件名对应的文件对象存在,则直接当前读取的源数据记录写入文 件对象。
[0041 ] 进一步,调用map方法中的write方法,添加所述HFile的文件名包括:
[0042] 在FileOu化U评ormat类中根据键值对的规则定义名称为recordWriters,类型为 HashMap<St;ring,RecordW;rite;r<K,V〉〉的变量;其中,recordWriters 的 key 的类型为字符 串 String,表不输出的文件名;recordWriters 的 value 的类型为 RecordW;rite;r<K,V〉,表 示记录的输出对象;
[0043] 所述调用write方法为调用context, write (key, value)方法,将该条源数据记录 对应的文件名添加到key的末尾。
[0044] 进一步,所述判断该HFile的文件名对应的源数据记录是否存在,若该HFile的文 件名对应的源数据记录不存在则根据该HFile的文件名创建该条源数据记录的输出对象, 并将该源数据记录写入所述输出对象,生成HFile文件包括:
[0045] 根据 recordWriters 变量中的 key 获取 recordWriter,若 recordWriter 不存在, 则表示该HFile的文件名对应的源数据记录不存在,则根据key创建recordWriter,并将将 该源数据记录写入recordWriter,生成HFile文件;
[0046] 若 recordWriter 存在,则直接使用 recordWriter 生成 HFile 文件。
[0047] 进一步,对已完成源数据记录写入的HFile文件加载至其对应的分区Region包 括:
[0048] 利用completebu化load命令将HFile文件加载到皿ase。
[0049] 采用本发明提供的基于HFile批量加载数据的方法,通过预分分区Region,形成 多个分区Region,避免了现有技术中Region分裂过程时间过长的问题;在此基础上,在Map 阶段生成HFile文件,避免了 Re化ce过程,提高了效率;并且,由于在Map阶段就成功生成 了 HFile文件,因此每生成一个HFile文件后可W保存该文件,避免MapRe化ce任务失败 后,所有的中间结果都被删除的问题,进一步提高了 HFile文件记载效率。
【附图说明】
[0050] 图1为本发明基于HFile批量加载数据的方法流程示意图;
[0051] 图2为本发明中根据源数据记录确定其需写入的HFile文件的文件名的流程示意 图;
[0052] 图3为将源数据记录写入其对应的HFile文件的流程示意图。
【具体实施方式】
[0053] 为使本发明的目的、技术方案及优点更加清楚明白,W下参照附图并举实施例,对 本发明进一步详细说明。
[0054] 本发明提供了一种基于HFile批量加载数据的方法,如图1所示,包括如下步骤: 阳化日]预分分区Region,形成与HFile文件--对应的多个分区Region ;
[0056] 读取源数据记录,分别确定每一条源数据记录需写入的HFile文件,并将源数据 记录写入其对应的HFile文件;
[0057] 对已完成源数据记录写入的HFile文件加载至其对应的分区Region。
[0058] 在本申请典型的实施例中,形成与HFile文件一一对应的多个分区Region可采用 W下方式: 阳059] 在进行预分分区Region时,首先,根据源数据的总数据量确定预分分区Region个 数;然后,采用源数据中自增的ID如采用源数据中的自增的字段作为分区Region的行主键 RowKey。
[0060] 例如,数据量1千万,预分10个分区Region, Region预分后的Startk巧和化化巧 分布如下表所示:
[0061]
阳062] 由于在数据导入前预分Region,避免了现有技术中采用的数据导入时,当数据量 达到阔值时再进行分裂带来的耗时问题,由此提高数据加载的效率。
[0063] 在形成了形成与HFile文件一一对应的多个分区Region的基础上,读取源数据记 录,分别确定每一条源数据记录需写入的HFile文件,并将源数据记录写入其对应的HFile 文件,包括:
[0064] 读取源数据记录,分别确定每一条源数据记录对应的HFile文件的文件名; 阳0化]根据所述文件名将源数据记录向各自对应的多个HFile文件写入。
[0066] 具体步骤如图2所示:
[0067] 在map的setup方法中获取所有分区Region的起始键值StartKey和终止键值 化化巧,生成起始键值Startifey和终止键值化化巧集合,并定义en化巧变量;
[0068] 读取一条源数据记录后,判断en化ey变量的值是否为空;
[0069] 若判断结果为emlKey变量的值为空,则判断当前读取的源数据记录中的所述自 增的ID是否在某个Region的起始键值StartKey和终止键值化化ey之间,如果当前读取的 源数据记录中的所述自增的ID处于某个Region的起始键值StartKey和终止键值化化ey 之间,则将当前读取的源数据记录中的en化ey变量赋值为该Region的终止键值化化ey,并 判断当前读取的源数据记录中的所述自增的ID是否等于emlKey变量的值;
[0070] 若当前读取的源数据记录中的所述自增的ID等于emlKey变量的值,则说明当前 读取的源数据记录已不属于该Region而属于该Region的下一个Region,将en化巧赋值更 新为该Region的下一个Region的化化巧,由此获得与该Region的下一个Region对应的 HFile文件的文件名。
[0071] 7、根据权利要求6所述的方法,其特征在于,若判断结果为emlKey变量的值不为 空,则判断当前读取的源数据记录中的所述自增的ID是否等于emlKey变量的值;
[0072] 当前读取的源数据记录中的所述自增的ID不等于emlKey变量的值,则说明当前 读取的源数据记录属于该Region,由此获得与该Region对应的HFile文件的文件名。
[007引在获得HFile的文件名后,对当前读取的源数据记录中的KeyValue进行排序;作 为实现排序的一种方式,可首先定义一个KeyValue的排序集合,然后将当前读取的源数据 记录中的KeyValue存放到所述排序集合中完成排序;例如采用W下方式:
[0074]定义 TreeSet<KeyValue〉treeMap = new TreeSet<KeyValue>化eyValue. COMPARATOR),并将当前读取的源数据记录中的Κ巧Value存放到treeMap完成排序。
[00巧]在上述过程中,可实现每个HFile文件中的Rowlfey只在一个Region中。由于记 录ID为自增,因此生成的单个HFile文件已按照RowKey字典排序,只需要对单个记录中的 K巧Value排序即可,从而避免了 Re化ce的排序过程。
[0076] 进一步,针对现有技术中map失败删除Hfile文件,需要重新加载数据的问题,本 申请的典型实施例中将源数据记录写入其对应的HFile文件后,将所述HFile文件存储到 自定义目录,由此,即使map失败,仍可加载已生成的的HFile文件,数据加载可W从失败处 开始。
[0077] 在确定当前源数据记录需写入的HFile文件的文件名后,将该条源数据记录写入 其对应的HFile文件包括如图3所示步骤:
[0078] 调用map方法中的write方法,添加所述HFile的文件名;
[0079] 利用write方法解析HFile的文件名;
[0080] 判断该HFile的文件名对应的文件对象是否存在,若该HFile的文件名对应的文 件对象不存在则根据该HFile的文件名创建文件对象,并将当前读取的源数据记录写入文 件对象;
[0081] 若该HFile的文件名对应的文件对象存在,则直接当前读取的源数据记录写入文 件对象。
[0082] 其中,调用map方法中的write方法,添加所述HFile的文件名包括:
[0083] 在FileOu化U评ormat类中根据键值对的规则定义名称为recordWriters,类型为 HashMap<St;ring,RecordW;rite;r<K,V〉〉的变量;其中,recordWriters 的 key 的类型为字符 串 String,表示输出的文件名;recordWriters 的 value 的类型为 RecordW;rite;r<K,V〉,表 示记录的输出对象;
[0084] 所述调用write方法为调用context, write (key, value)方法,将该条源数据记录 对应的文件名添加到key的末尾。 阳085] 进一步,所述判断该HFile的文件名对应的源数据记录是否存在,若该HFile的文 件名对应的源数据记录不存在则根据该HFile的文件名创建该条源数据记录的输出对象, 并将该源数据记录写入所述输出对象,生成HFile文件包括:
[0086] 根据 recordWriters 变量中的 k巧获取 recordWriter,若 recordWriter 不存在, 则表示该HFile的文件名对应的源数据记录不存在,则根据key创建recordWriter,并将将 该源数据记录写入recordWriter,生成HFile文件;
[0087] 若 recordWriter 存在,则直接使用 recordWriter 生成 HFile 文件。
[0088] 对已完成源数据记录写入的HFile文件加载至其对应的分区Region优选利用 completebu]_kload命令将HFile文件加载到皿ase。
[0089] 综上所述,采用本发明提供的一种基于HFile批量加载数据的方法,通过预分分 区Region,形成多个分区Region,避免了现有技术中Region分裂过程时间过长的问题; 在此基础上,在Map阶段生成HFile文件,避免了 Re化ce过程,提高了效率;并且,由于在 Map阶段就成功生成了 HFile文件,因此每生成一个HFile文件后可W保存该文件,避免 MapRe化ce任务失败后,所有的中间结果都被删除的问题,进一步提高了 HFile文件记载效 率。
[0090] W上所述仅为本发明的较佳实施例而已,并不用W限制本发明,凡在本发明的精 神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
【主权项】
1. 一种基于HFile批量加载数据的方法,其特征在于,包括: 预分分区Region,形成与HFile文件--对应的多个分区Region ; 读取源数据记录,分别确定每一条源数据记录需写入的HFile文件,并将源数据记录 写入其对应的HFile文件; 对已完成源数据记录写入的HFile文件加载至其对应的分区Region。2. 根据权利要求1所述的方法,其特征在于,读取源数据记录,分别确定每一条源数据 记录需写入的HFile文件,并将源数据记录写入其对应的HFile文件包括: 读取源数据记录,分别确定每一条源数据记录对应的HFile文件的文件名; 根据所述文件名将源数据记录向各自对应的HFile文件写入。3. 根据权利要求2所述的方法,其特征在于,将源数据记录写入其对应的HFile文件 后,将所述HFile文件存储到自定义目录。4. 根据权利要求3所述的方法,其特征在于,预分分区Region,形成与HFile文件-- 对应的多个分区Region包括: 预分分区Region,形成行主键RowKey自增的多个分区Region。5. 根据权利要求4所述的方法,其特征在于,所述预分分区Region,形成行主键RowKey 自增的多个分区Region包括: 根据源数据的总数据量确定预分分区Region个数及大小; 采用源数据中自增的ID作为分区Region的行主键RowKey。6. 根据权利要求5所述的方法,其特征在于,读取源数据记录,分别确定每一条源数据 记录对应的HFile文件的文件名包括: 在map的setup方法中获取所有分区Region的起始键值StartKey和终止键值EndKey, 生成起始键值StartKey和终止键值EndKey集合,并定义endKey变量; 读取一条源数据记录后,判断endKey变量的值是否为空; 若判断结果为endKey变量的值为空,则判断当前读取的源数据记录中的所述自增的 ID是否在某个Region的起始键值StartKey和终止键值EndKey之间,如果当前读取的源 数据记录中的所述自增的ID处于某个Region的起始键值StartKey和终止键值EndKey之 间,则将当前读取的源数据记录中的endKey变量赋值为该Region的终止键值EndKey,并判 断当前读取的源数据记录中的所述自增的ID是否等于endKey变量的值; 若当前读取的源数据记录中的所述自增的ID等于endKey变量的值,则说明当前读取 的源数据记录已不属于该Region而属于该Region的下一个Region,将endKey赋值更新为 该Region的下一个Region的EndKey,由此获得与该Region的下一个Region对应的HFile 文件的文件名。7. 根据权利要求6所述的方法,其特征在于,若判断结果为endKey变量的值不为空,则 判断当前读取的源数据记录中的所述自增的ID是否等于endKey变量的值; 当前读取的源数据记录中的所述自增的ID不等于endKey变量的值,则说明当前读取 的源数据记录属于该Region,由此获得与该Region对应的HFile文件的文件名。8. 根据权利要求6或7所述的方法,其特征在于,在获得HFile的文件名后,对当前读 取的源数据记录中的KeyValue进行排序。9. 根据权利要求8所述的方法,其特征在于,所述对当前读取的源数据记录中的 KeyValue进行排序包括: 定义一个KeyValue的排序集合; 将当前读取的源数据记录中的KeyValue存放到所述排序集合中完成排序。10. 根据权利要求1所述的方法,其特征在于,将该条源数据记录写入其对应的HFile 文件包括: 调用map方法中的write方法,添加所述HFile的文件名; 利用write方法解析HFile的文件名; 判断该HFile的文件名对应的文件对象是否存在,若该HFile的文件名对应的文件对 象不存在则根据该HFile的文件名创建文件对象,并将当前读取的源数据记录写入文件对 象; 若该HFile的文件名对应的文件对象存在,则直接当前读取的源数据记录写入文件对 象。11. 根据权利要求10所述的方法,其特征在于,调用map方法中的write方法,添加所 述HFile的文件名包括: 在FileOutputFormat类中根据键值对的规则定义名称为recordWriters,类型为 HashMap〈String,RecordWriter〈K,V>> 的变量;其中,recordWriters 的 key 的类型为字符 串String,表不输出的文件名;recordWriters的value的类型为RecordWriter〈K,V〉,表 示记录的输出对象; 所述调用write方法为调用context, write (key,value)方法,将该条源数据记录对应 的文件名添加到key的末尾。12. 根据权利要求11所述的方法,其特征在于,所述判断该HFile的文件名对应的源数 据记录是否存在,若该HFile的文件名对应的源数据记录不存在则根据该HFile的文件名 创建该条源数据记录的输出对象,并将该源数据记录写入所述输出对象,生成HFile文件 包括: 根据:recordWriters 变量中的 key 获取 recordWriter,若 recordWriter 不存在,则表 示该HFile的文件名对应的源数据记录不存在,则根据key创建recordWriter,并将将该源 数据记录写入recordWriter,生成HFile文件; 若recordWriter存在,则直接使用recordWriter生成HFile文件。13. 根据权利要求12所述的方法,其特征在于,对已完成源数据记录写入的HFile文件 加载至其对应的分区Region包括: 利用completebulkload命令将HFile文件加载到HBase。
【文档编号】G06F17/30GK105988995SQ201510039306
【公开日】2016年10月5日
【申请日】2015年1月27日
【发明人】谢忠贤, 浦世亮, 周明耀
【申请人】杭州海康威视数字技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1