基于HBASE的数据导入方法和系统.pdf

上传人:zhu****_FC 文档编号:2238206 上传时间:2018-08-03 格式:PDF 页数:18 大小:1.13MB
返回 下载 相关 举报
摘要
申请专利号:

CN201410016490.4

申请日:

2014.01.14

公开号:

CN104778182A

公开日:

2015.07.15

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 17/30申请日:20140114|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

博雅网络游戏开发(深圳)有限公司

发明人:

郑壮杰

地址:

518057广东省深圳市南山区中山园路1001号TCL产业园国际E城D3栋9B-C

优先权:

专利代理机构:

广州华进联合专利商标代理有限公司44224

代理人:

何平

PDF下载: PDF下载
内容摘要

一种基于HBase的数据导入方法,包括以下步骤:文件名提取线程提取文件压缩池中新上报文件的文件名,将提取的文件名存放到无读写锁的队列;文件处理线程从无读写锁的队列中获取文件名,从所述文件压缩池中提取文件名对应的文件,读取文件为文件流;文件处理线程将文件流中的行数据转换为json对象;文件处理线程根据json对象构造HBase的Row对象;存储线程将构造的Row对象导入HBase中。上述基于HBase的数据导入方法,通过无读写锁队列以及多线程并发处理机制,可提高将数据导入HBase的速度。此外,还提供一种基于HBase的数据导入系统。

权利要求书

1.  一种基于HBase的数据导入方法,包括以下步骤:
文件名提取线程提取文件压缩池中新上报文件的文件名,将提取的文件名 存放到无读写锁的队列;
文件处理线程从无读写锁的队列中获取文件名,从所述文件压缩池中提取 文件名对应的文件,读取文件为文件流;
文件处理线程将文件流中的行数据转换为json对象;
文件处理线程根据json对象构造HBase的Row对象;
存储线程将构造的Row对象导入HBase中。

2.
  根据权利要求1所述的基于HBase的数据导入方法,其特征在于,根据 json对象构造HBase的Row对象的步骤包括:
根据json对象构造Row对象的行键;
将构造的行键作为Row对象的主键初始化Row对象;
根据json对象构造初始化成功的Row对象的键值对。

3.
  根据权利要求2所述的基于HBase的数据导入方法,其特征在于,所述 根据json对象构造Row对象的行键的步骤包括:从行键构造规则配置文件中读 取json对象中的表名对应的行键构造规则;根据读取的行键构造规则以及json 对象中的键值对构造Row对象的行键;
根据json对象构造初始化成功的Row对象的键值对的步骤包括:根据json 对象中的表名查找对应的列类型配置文件;将json对象中的列值转换成其对应 列名在列类型配置文件中对应的列类型的值;将经过类型转换的列值转化成字 节数组;将列名与对应的列值构成键值对保存到初始化成功的Row对象中。

4.
  根据权利要求1至3其中一项所述的基于HBase的数据导入方法,其特 征在于,在所述根据json对象构造HBase的Row对象的步骤之后,所述方法还 包括:文件处理线程将构造的Row对象保存到缓存池;
所述存储线程将构造的Row对象导入HBase中的步骤包括:存储线程监听 缓存池数据量大小,当缓存池数据量大小达到阈值时,将缓存池中的Row对象 导入HBase中,重置缓存池。

5.
  根据权利要求4所述的基于HBase的数据导入方法,其特征在于,所述 方法还包括步骤:
验证线程校验HBase返回的写入结果,若发生写入错误,则记录错误发生 的行数据、行数据所在文件的文件名及行数据在文件中的行号。

6.
  一种基于HBase的数据导入系统,其特征在于,包括以下步骤:
文件名提取模块,用于提取文件压缩池中新上报文件的文件名,将提取的 文件名存放到无读写锁的队列;
文件读取模块,用于从队列中获取文件名,从所述文件压缩池中提取文件 名对应的文件,读取文件为文件流;
json对象转换模块,用于将文件流中的行数据转换为json对象;
Row对象构造模块,用于根据json对象构造HBase的Row对象;
数据导入模块,用于将构造的Row对象导入HBase中;
控制模块,用于启动文件名提取线程执行文件名提取模块,启动文件处理 线程执行文件读取模块、json对象转换模块和Row对象构造模块,以及启动存 储线程执行数据导入模块。

7.
  根据权利要求6所述的基于HBase的数据导入系统,其特征在于,所述 Row对象构造模块包括:
行键构造模块,用于根据json对象构造Row对象的行键;
Row对象初始化模块,用于将构造的行键作为Row对象的主键初始化Row 对象;
键值对构造模块,用于根据json对象构造初始化成功的Row对象的键值对。

8.
  根据权利要求7所述的基于HBase的数据导入系统,其特征在于,所述 行键构造模块包括:
规则读取单元,用于从行键构造规则配置文件中读取json对象中的表名对 应的行键构造规则;
行键构造单元,根据读取的行键构造规则以及json对象中的键值对构造 Row对象的行键;
所述键值对构造模块包括:
配置文件查找单元,用于根据json对象中的表名查找对应的列类型配置文 件;
列值转换单元,用于将json对象中的列值转换成其对应列名在列类型配置 文件中对应的列类型的值;
数组生成单元,用于将经过类型转换的列值转化成字节数组;
键值对保存单元,用于将列名与对应的列值构成键值对保存到初始化成功 的Row对象中。

9.
  根据权利要求6至8其中一项所述的基于HBase的数据导入系统,其特 征在于,所述系统还包括数据缓存模块,用于在根据json对象构造HBase的Row 对象之后,将构造的Row对象保存到缓存池;
所述控制模块还用于启动所述文件处理线程执行数据缓存模块;
所述数据导入模块用于监听缓存池数据量大小,当缓存池数据量大小达到 阈值时,将缓存池中的Row对象导入HBase中,重置缓存池。

10.
  根据权利要求9所述的基于HBase的数据导入系统,其特征在于,所 述系统还包括验证模块,用于校验HBase返回的写入结果,若发生写入错误, 则记录错误发生的行数据、行数据所在文件的文件名及行数据在文件中的行号;
所述控制模块还用于启动验证线程执行验证模块。

说明书

基于HBase的数据导入方法和系统
技术领域
本发明涉及大数据处理技术,特别涉及基于HBase的数据导入方法和系统。
背景技术
随着移动互联网技术的高速发展,尤其是智能移动终端的广泛普及,互联 网相关企业的业务数据量呈现爆发式的增长。如何快速有效地处理这些数据, 将其转化为有价值的信息,是亟需解决的问题。HBase(Hadoop Database)作为 一个构建在HDFS(Hadoop Distributed File System,Hadoop分布式文件系统) 上,具有高可靠性、高性能、面向列、可伸缩等优秀特性的分布式存储系统, 为数据的存储和处理提供了经济、高效、安全和可靠的保障,逐渐成为饱受海 量数据困扰的企业存储数据首选的解决方案。
有多种方法可以将数据加载到HBase的数据表中,比如通过MapReduce(一 种用于大规模数据集的并行运算)调用TableOutputFormat(将MapReduce的输 出导入到HBase的一种方法)方法,或者将数据以HBase内部的组织格式输出 成文件加载到集群中,这些方法都需要启动MapReduce,有一定的时间延迟, 不能满足对进行数据快速存储的要求。
发明内容
基于此,有必要提供一种可提高数据导入速度的基于HBase的数据导入方 法。
一种基于HBase的数据导入方法,包括以下步骤:
文件名提取线程提取文件压缩池中新上报文件的文件名,将提取的文件名 存放到无读写锁的队列;
文件处理线程从无读写锁的队列中获取文件名,从所述文件压缩池中提取 文件名对应的文件,读取文件为文件流;
文件处理线程将文件流中的行数据转换为json对象;
文件处理线程根据json对象构造HBase的Row对象;
存储线程将构造的Row对象导入HBase中。
在其中一个实施例中,根据json对象构造HBase的Row对象的步骤包括:
根据json对象构造Row对象的行键;
将构造的行键作为Row对象的主键初始化Row对象;
根据json对象构造初始化成功的Row对象的键值对。
在其中一个实施例中,所述根据json对象构造Row对象的行键的步骤包括: 从行键构造规则配置文件中读取json对象中的表名对应的行键构造规则;根据 读取的行键构造规则以及json对象中的键值对构造Row对象的行键;
根据json对象构造初始化成功的Row对象的键值对的步骤包括:根据json 对象中的表名查找对应的列类型配置文件;将json对象中的列值转换成其对应 列名在列类型配置文件中对应的列类型的值;将经过类型转换的列值转化成字 节数组;将列名与对应的列值构成键值对保存到初始化成功的Row对象中。
在其中一个实施例中,在所述根据json对象构造HBase的Row对象的步骤 之后,所述方法还包括:文件处理线程将构造的Row对象保存到缓存池;
所述存储线程将构造的Row对象导入HBase中的步骤包括:存储线程监听 缓存池数据量大小,当缓存池数据量大小达到阈值时,将缓存池中的Row对象 导入HBase中,重置缓存池。
在其中一个实施例中,所述方法还包括步骤:
验证线程校验HBase返回的写入结果,若发生写入错误,则记录错误发生 的行数据、行数据所在文件的文件名及行数据在文件中的行号。
此外,还有必要提供一种可提高数据导入速度的基于HBase的数据导入系 统。
一种基于HBase的数据导入系统,包括以下步骤:
文件名提取模块,用于提取文件压缩池中新上报文件的文件名,将提取的 文件名存放到无读写锁的队列;
文件读取模块,用于从队列中获取文件名,从所述文件压缩池中提取文件 名对应的文件,读取文件为文件流;
json对象转换模块,用于将文件流中的行数据转换为json对象;
Row对象构造模块,用于根据json对象构造HBase的Row对象;
数据导入模块,用于将构造的Row对象导入HBase中;
控制模块,用于启动文件名提取线程执行文件名提取模块,启动文件处理 线程执行文件读取模块、json对象转换模块和Row对象构造模块,以及启动存 储线程执行数据导入模块。
在其中一个实施例中,所述Row对象构造模块包括:
行键构造模块,用于根据json对象构造Row对象的行键;
Row对象初始化模块,用于将构造的行键作为Row对象的主键初始化Row 对象;
键值对构造模块,用于根据json对象构造初始化成功的Row对象的键值对。
在其中一个实施例中,所述行键构造模块包括:
规则读取单元,用于从行键构造规则配置文件中读取json对象中的表名对 应的行键构造规则;
行键构造单元,根据读取的行键构造规则以及json对象中的键值对构造 Row对象的行键;
所述键值对构造模块包括:
配置文件查找单元,用于根据json对象中的表名查找对应的列类型配置文 件;
列值转换单元,用于将json对象中的列值转换成其对应列名在列类型配置 文件中对应的列类型的值;
数组生成单元,用于将经过类型转换的列值转化成字节数组;
键值对保存单元,用于将列名与对应的列值构成键值对保存到初始化成功 的Row对象中。
在其中一个实施例中,所述系统还包括数据缓存模块,用于在根据json对 象构造HBase的Row对象之后,将构造的Row对象保存到缓存池;
所述控制模块还用于启动所述文件处理线程执行数据缓存模块;
所述数据导入模块用于监听缓存池数据量大小,当缓存池数据量大小达到 阈值时,将缓存池中的Row对象导入HBase中,重置缓存池。
在其中一个实施例中,所述系统还包括验证模块,用于校验HBase返回的 写入结果,若发生写入错误,则记录错误发生的行数据、行数据所在文件的文 件名及行数据在文件中的行号;
所述控制模块还用于启动验证线程执行验证模块。
上述基于HBase的数据导入方法和系统,文件名提取线程提取文件压缩池 中新上报文件的文件名,将提取的文件名存放到无读写锁的队列,文件处理线 程从无读写锁的队列中获取文件名,并从文件压缩池中提取文件名对应的文件, 读取文件为文件流;由于队列无读写锁,文件名提取线程将文件名存放到队列 中时无需加写锁、解写锁,文件处理线程从无读写锁的队列中获取文件名时, 无需加读锁、解读锁,而且文件名提取线程与文件处理线程可并发地从队列中 读写数据,从而提高了读写数据的速度。进一步的,文件处理线程将文件流中 的行数据转换为json对象,并根据json对象构造HBase的Row对象;存储线程 将构造的Row对象导入HBase中,文件处理线程与存储线程可并发地进行工作, 两个线程之间互不影响工作进度。因而,上述基于HBase的数据导入方法和系 统,通过无读写锁队列以及多线程并发处理机制,可提高将数据导入HBase的 速度。
附图说明
图1为一个实施例中的基于HBase的数据导入方法的流程示意图;
图2为一个实施例中根据json对象构造HBase的Row对象的步骤的流程示 意图;
图3为一个实施例中的Row对象缓存示意图;
图4为一个实施例中的基于HBase的数据导入方法的流程示意图;
图5为一个实施例中的基于HBase的数据导入系统结构示意图;
图6为一个实施例中Row对象构造模块的结构示意图;
图7为另一实施例中的基于HBase的数据导入系统结构示意图;
图8为又一实施例中的基于HBase的数据导入系统结构示意图。
具体实施方式
如图1所示,在一个实施例中,一种基于HBase的数据导入方法,包括以 下步骤:
步骤S102,文件名提取线程提取文件压缩池中新上报文件的文件名,将提 取的文件名存放到无读写锁的队列。
文件压缩池为文件存储空间。无读写锁的队列为读写队列中数据不需要加 解读写锁的队列;无读写锁的队列可保证线程安全,线程安全指的是在多个线 程并发读写队列中数据时不出现错误。
在一个实施例中,可由日志中心等文件产生方上报文件到文件压缩池。文 件名提取线程可实时监测文件压缩池中是否有新上报的文件,当文件压缩池中 有新上报的文件时,提取新上报文件的文件名。
步骤S104,文件处理线程从无读写锁的队列中获取文件名,从文件压缩池 中提取文件名对应的文件,读取文件为文件流。
文件处理线程可循环执行步骤S104、S106和S108。
在一个实施例中,在读取文件为文件流的步骤之前,上述基于HBase的数 据导入方法还包括步骤:文件处理线程验证文件的完整性,若文件不完整,则 将文件移到错误处理目录,由该文件等待进一步的处理,若文件完整,则进入 到读取文件为文件流的步骤。文件处理线程可计算文件的信息摘要值(如md5 值),根据信息摘要值验证文件的完整性。本实施中,在对文件进行处理前,先 验证文件的完整性,可避免文件不完整性而导致文件处理过程出错。
在一个实施例中,读取文件为文件流的步骤为:根据文件的文件名后缀选 取对应的算法读取文件为文件流。文件名后缀包括gz、zip等,文件名后缀可表 征文件类型,不同的文件名后缀代表不同的文件类型。本实施例中,可智能地 选择相应算法读取不同类型的文件为文件流,从而可提高方法的可移植性。
步骤S106,文件处理线程将文件流中的行数据转换为json对象。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,本文件中的 json对象可理解为一种“名称/值”对的集合。
在一个实施例中,文件处理线程可执行转化器,通过转化器将文件流中的 行数据转换为json对象。转化器为用户将文件流中的行数据转换为json对象的 函数或功能模块。
在一个实施例中,在步骤S106之前,上述基于HBase的数据导入方法还包 括:对文件流中的行数据进行预处理。文件流中的每一行数据都构成一条行数 据。对文件流中的行数据进行预处理包括以下步骤:
(1)校验行数据中是不包含指定的列名,根据校验结果判断行数据是否有 效。若行数据中不包含指定的列名,则判定行数据无效,并将无效的行数据删 除。
(2)根据预设的列名与列值的映射关系给行数据中没有对应列名的列值补 充列名。文件流中的行数据包括多对列名与列值。列名与对应的列值之间用冒 号隔开,两对列名与列值之间用逗号隔开。若行数据中某一列值没有对应的列 名,则根据预设的列名与列值的映射关系查询该列值对应的列名,将查找到的 列名在行数据中补充为该列值对应的列名。
(3)按照预设逻辑根据行数据中指定的列值计算新增加的列名和列值。原 始行数据中的信息量有限,有时需要根据原始行数据增加额外的列名和列值。
(4)删除行数据中指定的无效数据。
步骤S108,文件处理线程根据json对象构造HBase的Row对象。
Row是HBase的通用的应用程序接口,用于操作HBase中的行数据。
在一个实施例中,文件处理线程可将转换而成的json对象传给用于根据json 对象构造HBase的Row对象的函数并执行该函数,例如可命名用于构造HBase 的Row对象的函数为cacheRow函数。
如图2所示,在一个实施例中,根据json对象构造HBase的Row对象的步 骤包括:
步骤S202,根据json对象构造Row对象的行键。
在一个实施例中,步骤S202包括:从行键构造规则配置文件中读取json对 象中的表名对应的行键构造规则;根据读取的行键构造规则以及json对象中的 键值对构造Row对象的行键。
行键构造规则配置文件中保存了预先配置的各个表名对应的行键构造规 则。行键构造规则配置文件命名为rowkey.ini。步骤S202可首先从rowkey.ini 中查找json对象中的表名对应的行键构造规则,若查找失败,则可从保存默认 行键构造规则的文件(命名为global.ini)中读取默认行键构造规则。
例如,原始行数据为:
{"_tnm":"user_order","_plat":"1000","_uid":"1000","_tm":"1386959448","pid": "10000000","blindmin_5":"100","blindmin_10":"60","blindmin_50":"20"......},json 对象所包含的数据内容与行数据的数据内容相同;
读取的行键构造规则为:
user_order={"fields":{"_plat":5,"_uid":10,"_tm":10,"pid":10},"reverse":true,"lin  e_num":false}。其中:
user_order表示该行键构造规则对应的表名,从行数据中的_tnm列名对应的 列值获取。
fields所包括的数据项表示行键由哪些列组成,每个列的长度为多少。该例 中的行键由_plat、_uid、_tm和pid这四个列组成。例如,_plat的长度为5位字 符,如果长度不足5位,则在值前面补0,该例中的_plat转换后为01000。组成 行键其他列的构成规则相同。
reverse表示原始行数据中的时间戳是否需反转,true表示反转。该例的时 间戳为9999999999-1386959448=8613040551。由于HBase存储是按字典序排序, 时间早的数据排在前面,而在业务系统中,最新数据的查找频率比较大。将时 间戳反转一下,可使最新的数据排在前面,从而提高查询速度。
line_num表示rowkey是否要添加行号,false表示不添加。行号为行数据在 文件中的行位置。由于时间戳只精确到秒,同一秒内同一个用户可能会有多条 操作记录,而在hbase中,相同rowkey的记录会被新纪录覆盖,在每个rowkey 中添加该行的行号可以避免这个问题。
根据上面行数据以及行键构造的规则,可构造行键为:
rowkey=_plat+_uid+(9999999999-_tm)+pid=010000000001000861304055100 10000000。
步骤S204,将构造的行键作为Row对象的主键初始化Row对象。
步骤S206,根据json对象构造初始化成功的Row对象的键值对。
在一个实施例中,步骤S206包括:根据json对象中的表名查找对应的列类 型配置文件;将json对象中的列值转换成其对应列名在列类型配置文件中对应 的列类型的值;将经过类型转换的列值转化成字节数组;将列名与对应的列值 构成键值对保存到初始化成功的Row对象中。
列类型配置文件为xml文件,以“表名.xml”命名。以上例为基础,列类型 配置文件为use_order.xml。列类型配置文件中描述列名对应的列类型。Row对 象中的列名对应的列值的类型需要与列类型配置文件中列名对应的列类型一 致。因此,可查找json对象中的列名在列类型配置文件中对应的列类型,将该 列名在json对象中对应的列值的类型转换为其在列类型配置文件中对应的列类 型。
上述基于HBase的数据导入方法,采用行键构造规则配置文件保存配置的 行键构造规则,自动根据行键构造规则构造行键,并采用列类型配置文件保存 配置的列名对应的列类型,自动根据列类型配置文件中列名对应的列类型转换 json对象中列值的类型,可使方法的通用性得到增强。
步骤S110,存储线程将构造的Row对象导入HBase中。
存储线程可触发用于将构造的Row对象导入HBase中的函数(例如,可命 名该函数为submit函数),通过该函数将构造的Row对象导入HBase中。
在一个实施例中,在步骤S108之后,上述基于HBase的数据导入方法还包 括步骤:文件处理线程将构造的Row对象保存到缓存池。在一个实施例中,文 件处理线程将构造的Row对象保存到缓存池包括以下步骤:根据预先配置的分 表规则以及Row对象中的表名计算Row对象对应的分表名;将Row对象保存 到缓存池中其分表名对应的列表中。
具体的,可从分表配置文件中读取Row对象的表名对应的分表规则。分表 配置文件命名为split.ini。例如,分表规则为:user_order=m,100,_plat;其中,m 表示取模,100表示模除值,_plat表示被取模的列名,以上述行数据内容(Row 对象的数据内容与行数据内容相同)为例,_plat对应的列值为1000, 1000%100=0,则Row对象对应的分表名=user_order_0。采用分表配置文件保存 配置的分表规则,自动根据分表规则计算分表名,可使上述基于HBase的数据 导入方法的通用性得到增强。
进一步的,可在缓存池中查找Row对象的分表名对应的列表,若未查找到, 则建立分表名对应的列表;进一步的,将Row对象添加到其分表名对应的列表 中。图3为一个实施例中的Row对象缓存示意图。其中,user_order_0、… user_order_n和user_login_0为分表名;row即为row对象;每个row对象包含 行键(rowkey)以及多个键值对(keyvalue),各个表名及其对应的row对象构 成map集合存储在缓存池中。
本实施中,步骤S110包括以下步骤:存储线程监听缓存池数据量大小,当 缓存池数据量大小达到阈值时,将缓存池中的Row对象导入HBase中,重置缓 存池。
具体的,可获取缓存池中的所有分表名,对应每个分表名实例化一个HTable 对象,将缓存池中各分表名对应的Row对象列表通过无锁机制批量导入HBase 中分表名对应的HTable对象。无锁机制可保证多线程快速存储数据的要求。进 一步的,HBase可将导入的数据写入其缓冲区memstore;当缓冲区数据量达到 阈值后,将缓冲区数据写入HFile文件;而当HFile文件数量达到预设数量时, 将HFile文件合并成一个大的HFile文件;进一步的,返回写入结果。
本实施例将构造的Row对象保存到缓存池中,当缓存池数据量大小达到阈 值时,将缓存池中的Row对象导入HBase中,可减少与HBase进行RPC通讯 的次数,从而提高整体的数据导入速度。
在一个实施例中,上述基于HBase的数据导入方法还包括步骤:验证线程 校验HBase返回的写入结果,若发生写入错误,则记录错误发生的行数据、行 数据所在文件的文件名及行数据在文件中的行号。
本实施例采用验证线程校验HBase返回的写入结果,验证线程可与其它线 程并发工作,从而提高处理速度;另外,本实施例还记录错误发生的行数据、 行数据所在文件的文件名及行数据在文件中的行号,数据准确度精确到行,从 而提高了数据存储的精确度。
图4为一个实施例中的基于HBase的数据导入方法的流程示意图。如图4 所示,一种基于HBase的数据导入方法包括以下步骤:
步骤S401,从文件压缩池中提取文件。
步骤S402,验证文件的md5完整性,若不完整,则执行步骤S403,若完整, 则执行步骤S404。具体的,可计算文件的md5值,根据md5值验证文件的完整 性。
步骤S403,将文件移到错误处理目录。
步骤S404,根据文件的文件名后缀选取对应的算法读取文件为文件流。
步骤S405,将文件流中的行数据转换为json对象。
步骤S406,根据json对象构造HBase的Row对象。可结合配置的或默认 的行键构造规则以及配置的列类型构造Row对象。
步骤S407,将Row对象保存到缓存池。可根据配置的分表规则以及Row 对象中的表名计算Row对象对应的分表名;将Row对象保存到缓存池中其分表 名对应的列表中。
步骤S408,当缓存池数据量大小达到阈值时,将缓存池中的Row对象导入 HBase中。
步骤S409,校验HBase返回的写入结果,若有写入错误,则执行步骤S410, 若无写入错误,则执行步骤S411。
步骤S410,记录错误发生的行数据、行数据所在文件的文件名及行数据在 文件中的行号。
步骤S411,重置缓存池。
其中步骤S401~S407可由文件处理线程执行,步骤S408可由存储线程执 行,步骤S409~S410可由验证线程执行,步骤S411可由存储线程执行。
如图5所示,在一个实施例中,一种基于HBase的数据导入系统,包括文 件名提取模块10、文件读取模块20、json对象转换模块30、Row对象构造模块 40、数据导入模块50和控制模块80,其中:
控制模块80用于启动文件名提取线程执行文件名提取模块10,启动文件处 理线程执行文件读取模块20、json对象转换模块30和Row对象构造模块40, 以及启动存储线程执行数据导入模块50。
文件名提取模块10用于提取文件压缩池中新上报文件的文件名,将提取的 文件名存放到无读写锁的队列。
文件压缩池为文件存储空间。无读写锁的队列为读写队列中数据不需要加 解读写锁的队列;无读写锁的队列可保证线程安全,线程安全指的是在多个线 程并发读写队列中数据时不出现错误。
在一个实施例中,可由日志中心等文件产生方上报文件到文件压缩池。文 件名提取模块10可实时监测文件压缩池中是否有新上报的文件,当文件压缩池 中有新上报的文件时,提取新上报文件的文件名。
文件读取模块20用于从队列中获取文件名,从文件压缩池中提取文件名对 应的文件,读取文件为文件流。
在一个实施例中,上述基于HBase的数据导入系统还包括完整性验证模块 (图中未示出)。控制模块80还用于启动文件处理线程执行验证模块。验证模 块用于在读取文件为文件流之前,验证文件的完整性,若文件不完整,则将文 件移到错误处理目录,由该文件等待进一步的处理,若文件完整,则启动文件 读取模块20读取文件为文件流。文件处理线程可计算文件的信息摘要值(如 md5值等),根据信息摘要值验证文件的完整性。本实施中,在对文件进行处理 前,先验证文件的完整性,可避免文件不完整性而导致文件处理过程出错。
在一个实施例中,文件读取模块20可根据文件的文件名后缀选取对应的算 法读取文件为文件流。文件名后缀包括gz、zip等,文件名后缀可表征文件类型, 不同的文件名后缀代表不同的文件类型。本实施例中,可智能地选择相应算法 读取不同类型的文件为文件流,从而可提高系统的可移植性。
json对象转换模块30用于将文件流中的行数据转换为json对象。
在一个实施例中,上述基于HBase的数据导入系统还包括转换预处理模块 (图中未示出),用于在将文件流中的行数据转换为json对象之前,对文件流中 的行数据进行预处理。文件流中的每一行数据都构成一条行数据。对文件流中 的行数据进行预处理的过程包括:
(1)校验行数据中是不包含指定的列名,根据校验结果判断行数据是否有 效。若行数据中不包含指定的列名,则判定行数据无效,并将无效的行数据删 除。
(2)根据预设的列名与列值的映射关系给行数据中没有对应列名的列值补 充列名。文件流中的行数据包括多对列名与列值。列名与对应的列值之间用冒 号隔开,两对列名与列值之间用逗号隔开。若行数据中某一列值没有对应的列 名,则根据预设的列名与列值的映射关系查询该列值对应的列名,将查找到的 列名在行数据中补充为该列值对应的列名。
(3)按照预设逻辑根据行数据中指定的列值计算新增加的列名和列值。原 始行数据中的信息量有限,有时需要根据原始行数据增加额外的列名和列值。
(4)删除行数据中指定的无效数据。
Row对象构造模块40用于根据json对象构造HBase的Row对象。
在一个实施例中,Row对象构造模块40可将转换而成的json对象传给用于 根据json对象构造HBase的Row对象的函数并执行该函数,例如可命名用于构 造HBase的Row对象的函数为cacheRow函数。
如图6所示,在一个实施例中,Row对象构造模块40包括行键构造模块402、 Row对象初始化模块404和键值对构造模块406,其中:
行键构造模块402用于根据json对象构造Row对象的行键。
在一个实施例中,行键构造模块402包括规则读取单元和行键构造单元(图 中未示出)。规则读取单元用于从行键构造规则配置文件中读取json对象中的表 名对应的行键构造规则,行键构造单元用于根据读取的行键构造规则以及json 对象中的键值对构造Row对象的行键。
行键构造规则配置文件中保存了预先配置的各个表名对应的行键构造规 则。规则读取单元可首先从行键构造规则配置文件中查找json对象中的表名对 应的行键构造规则,若查找失败,则可从保存默认行键构造规则的文件中读取 默认行键构造规则。
Row对象初始化模块404用于将构造的行键作为Row对象的主键初始化 Row对象。
键值对构造模块406用于根据json对象构造初始化成功的Row对象的键值 对。
在一个实施例中,键值对构造模块406包括配置文件查找单元、列值转换 单元、数组生成单元和键值对保存单元(图中未示出)。配置文件查找单元用于 根据json对象中的表名查找对应的列类型配置文件,列值转换单元用于将json 对象中的列值转换成其对应列名在列类型配置文件中对应的列类型的值,数组 生成单元用于将经过类型转换的列值转化成字节数组,以及键值对保存单元用 于将列名与对应的列值构成键值对保存到初始化成功的Row对象中。
在一个实施例中,列类型配置文件为xml文件,以“表名.xml”命名。列类 型配置文件中描述列名对应的列类型。Row对象中的列名对应的列值的类型需 要与列类型配置文件中列名对应的列类型一致。因此,键值对构造模块406可 查找json对象中的列名在列类型配置文件中对应的列类型,将该列名在json对 象中对应的列值的类型转换为其在列类型配置文件中对应的列类型。
上述基于HBase的数据导入系统,采用行键构造规则配置文件保存配置的 行键构造规则,自动根据行键构造规则构造行键,并采用列类型配置文件保存 配置的列名对应的列类型,自动根据列类型配置文件中列名对应的列类型转换 json对象中列值的类型,可使方法的通用性得到增强。
数据导入模块50用于将构造的Row对象导入HBase中。
如图7所示,在一个实施例中,上述基于HBase的数据导入系统还包括数 据缓存模块60。控制模块80还用于启动文件处理线程执行数据缓存模块60。 数据缓存模块60用于将构造的Row对象保存到缓存池。在一个实施例中,数据 缓存模块60根据预先配置的分表规则以及Row对象中的表名计算Row对象对 应的分表名,将Row对象保存到缓存池中其分表名对应的列表中。
具体的,数据缓存模块60可从分表配置文件中读取Row对象的表名对应的 分表规则。采用分表配置文件保存配置的分表规则,自动根据分表规则计算分 表名,可使上述基于HBase的数据导入系统的通用性得到增强。
进一步的,数据缓存模块60可在缓存池中查找Row对象的分表名对应的列 表,若未查找到,则建立分表名对应的列表;进一步的,将Row对象添加到其 分表名对应的列表中。
本实施中,数据导入模块50可存储线程监听缓存池数据量大小,当缓存池 数据量大小达到阈值时,将缓存池中的Row对象导入HBase中,重置缓存池。
具体的,数据导入模块50可获取缓存池中的所有分表名,对应每个分表名 实例化一个HTable对象,将缓存池中各分表名对应的Row对象列表通过无锁机 制批量导入HBase中分表名对应的HTable对象。无锁机制可保证多线程快速存 储数据的要求。进一步的,HBase可将导入的数据写入其缓冲区memstore;当 缓冲区数据量达到阈值后,将缓冲区数据写入HFile文件;而当HFile文件数量 达到预设数量时,将HFile文件合并成一个大的HFile文件;进一步的,返回写 入结果。
本实施例将构造的Row对象保存到缓存池中,当缓存池数据量大小达到阈 值时,将缓存池中的Row对象导入HBase中,可减少与HBase进行RPC通讯 的次数,从而提高整体的数据导入速度。
如图8所示,在一个实施例中,上述基于HBase的数据导入系统还包括验 证模块70。控制模块80还用于启动验证线程执行验证模块70。验证模块70用 于校验HBase返回的写入结果,若发生写入错误,则记录错误发生的行数据、 行数据所在文件的文件名及行数据在文件中的行号。
本实施例采用验证线程校验HBase返回的写入结果,验证线程可与其它线 程并发工作,从而提高处理速度;另外,本实施例还记录错误发生的行数据、 行数据所在文件的文件名及行数据在文件中的行号,数据准确度精确到行,从 而提高了数据存储的精确度。
上述基于HBase的数据导入方法和系统,文件名提取线程提取文件压缩池 中新上报文件的文件名,将提取的文件名存放到无读写锁的队列,文件处理线 程从无读写锁的队列中获取文件名,并从文件压缩池中提取文件名对应的文件, 读取文件为文件流;由于队列无读写锁,文件名提取线程将文件名存放到队列 中时无需加写锁、解写锁,文件处理线程从无读写锁的队列中获取文件名时, 无需加读锁、解读锁,而且文件名提取线程与文件处理线程可并发地从队列中 读写数据,从而提高了读写数据的速度。进一步的,文件处理线程将文件流中 的行数据转换为json对象,并根据json对象构造HBase的Row对象;存储线程 将构造的Row对象导入HBase中,文件处理线程与存储线程可并发地进行工作, 两个线程之间互不影响工作进度。因而,上述基于HBase的数据导入方法和系 统,通过无读写锁队列以及多线程并发处理机制,可提高将数据导入HBase的 速度。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程, 是可以通过计算机程序控制相关的硬件来完成的,所述的程序可存储于一计算 机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。 其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory, ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细, 但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域 的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和 改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附 权利要求为准。

基于HBASE的数据导入方法和系统.pdf_第1页
第1页 / 共18页
基于HBASE的数据导入方法和系统.pdf_第2页
第2页 / 共18页
基于HBASE的数据导入方法和系统.pdf_第3页
第3页 / 共18页
点击查看更多>>
资源描述

《基于HBASE的数据导入方法和系统.pdf》由会员分享,可在线阅读,更多相关《基于HBASE的数据导入方法和系统.pdf(18页珍藏版)》请在专利查询网上搜索。

一种基于HBase的数据导入方法,包括以下步骤:文件名提取线程提取文件压缩池中新上报文件的文件名,将提取的文件名存放到无读写锁的队列;文件处理线程从无读写锁的队列中获取文件名,从所述文件压缩池中提取文件名对应的文件,读取文件为文件流;文件处理线程将文件流中的行数据转换为json对象;文件处理线程根据json对象构造HBase的Row对象;存储线程将构造的Row对象导入HBase中。上述基于HBas。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1