CN104778182A - 基于HBase的数据导入方法和系统 - Google Patents
基于HBase的数据导入方法和系统 Download PDFInfo
- Publication number
- CN104778182A CN104778182A CN201410016490.4A CN201410016490A CN104778182A CN 104778182 A CN104778182 A CN 104778182A CN 201410016490 A CN201410016490 A CN 201410016490A CN 104778182 A CN104778182 A CN 104778182A
- Authority
- CN
- China
- Prior art keywords
- row
- file
- hbase
- data
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种基于HBase的数据导入方法,包括以下步骤:文件名提取线程提取文件压缩池中新上报文件的文件名,将提取的文件名存放到无读写锁的队列;文件处理线程从无读写锁的队列中获取文件名,从所述文件压缩池中提取文件名对应的文件,读取文件为文件流;文件处理线程将文件流中的行数据转换为json对象;文件处理线程根据json对象构造HBase的Row对象;存储线程将构造的Row对象导入HBase中。上述基于HBase的数据导入方法,通过无读写锁队列以及多线程并发处理机制,可提高将数据导入HBase的速度。此外,还提供一种基于HBase的数据导入系统。
Description
【技术领域】
本发明涉及大数据处理技术,特别涉及基于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,"line_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=01000000000100086130405510010000000。
步骤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)等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (10)
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返回的写入结果,若发生写入错误,则记录错误发生的行数据、行数据所在文件的文件名及行数据在文件中的行号;
所述控制模块还用于启动验证线程执行验证模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410016490.4A CN104778182B (zh) | 2014-01-14 | 2014-01-14 | 基于HBase的数据导入方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410016490.4A CN104778182B (zh) | 2014-01-14 | 2014-01-14 | 基于HBase的数据导入方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104778182A true CN104778182A (zh) | 2015-07-15 |
CN104778182B CN104778182B (zh) | 2018-03-02 |
Family
ID=53619649
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410016490.4A Active CN104778182B (zh) | 2014-01-14 | 2014-01-14 | 基于HBase的数据导入方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104778182B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106354788A (zh) * | 2016-08-23 | 2017-01-25 | 无锡天脉聚源传媒科技有限公司 | 一种文件读取方法及装置 |
CN106776795A (zh) * | 2016-11-23 | 2017-05-31 | 黄健文 | 基于Hbase数据库的数据写入方法及装置 |
CN107633087A (zh) * | 2017-09-29 | 2018-01-26 | 南威软件股份有限公司 | 一种基于数据库的数据存储方法 |
CN108446363A (zh) * | 2018-03-13 | 2018-08-24 | 北京奇安信科技有限公司 | 一种kv引擎的数据处理方法及装置 |
CN111241171A (zh) * | 2019-10-28 | 2020-06-05 | 杭州美创科技有限公司 | 数据库全量数据抽取方法 |
CN111338583A (zh) * | 2020-05-19 | 2020-06-26 | 北京数字绿土科技有限公司 | 一种高频数据存储方法、结构、计算机 |
CN112445596A (zh) * | 2020-11-27 | 2021-03-05 | 平安普惠企业管理有限公司 | 基于多线程的数据导入方法、系统及存储介质 |
CN112612786A (zh) * | 2020-11-24 | 2021-04-06 | 北京思特奇信息技术股份有限公司 | 一种大数据量的行列转换方法及系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101079902A (zh) * | 2007-06-29 | 2007-11-28 | 清华大学 | 海量数据分级存储方法 |
US20100161565A1 (en) * | 2008-12-18 | 2010-06-24 | Electronics And Telecommunications Research Institute | Cluster data management system and method for data restoration using shared redo log in cluster data management system |
CN102663117A (zh) * | 2012-04-18 | 2012-09-12 | 中国人民大学 | 面向数据库与Hadoop混合平台的OLAP查询处理方法 |
CN103049556A (zh) * | 2012-12-28 | 2013-04-17 | 中国科学院深圳先进技术研究院 | 一种海量医疗数据的快速统计查询方法 |
US20130103658A1 (en) * | 2011-10-19 | 2013-04-25 | Vmware, Inc. | Time series data mapping into a key-value database |
-
2014
- 2014-01-14 CN CN201410016490.4A patent/CN104778182B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101079902A (zh) * | 2007-06-29 | 2007-11-28 | 清华大学 | 海量数据分级存储方法 |
US20100161565A1 (en) * | 2008-12-18 | 2010-06-24 | Electronics And Telecommunications Research Institute | Cluster data management system and method for data restoration using shared redo log in cluster data management system |
US20130103658A1 (en) * | 2011-10-19 | 2013-04-25 | Vmware, Inc. | Time series data mapping into a key-value database |
CN102663117A (zh) * | 2012-04-18 | 2012-09-12 | 中国人民大学 | 面向数据库与Hadoop混合平台的OLAP查询处理方法 |
CN103049556A (zh) * | 2012-12-28 | 2013-04-17 | 中国科学院深圳先进技术研究院 | 一种海量医疗数据的快速统计查询方法 |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106354788A (zh) * | 2016-08-23 | 2017-01-25 | 无锡天脉聚源传媒科技有限公司 | 一种文件读取方法及装置 |
CN106776795A (zh) * | 2016-11-23 | 2017-05-31 | 黄健文 | 基于Hbase数据库的数据写入方法及装置 |
CN106776795B (zh) * | 2016-11-23 | 2020-05-12 | 黄健文 | 基于Hbase数据库的数据写入方法及装置 |
CN107633087A (zh) * | 2017-09-29 | 2018-01-26 | 南威软件股份有限公司 | 一种基于数据库的数据存储方法 |
CN108446363A (zh) * | 2018-03-13 | 2018-08-24 | 北京奇安信科技有限公司 | 一种kv引擎的数据处理方法及装置 |
CN111241171A (zh) * | 2019-10-28 | 2020-06-05 | 杭州美创科技有限公司 | 数据库全量数据抽取方法 |
CN111338583A (zh) * | 2020-05-19 | 2020-06-26 | 北京数字绿土科技有限公司 | 一种高频数据存储方法、结构、计算机 |
CN112612786A (zh) * | 2020-11-24 | 2021-04-06 | 北京思特奇信息技术股份有限公司 | 一种大数据量的行列转换方法及系统 |
CN112445596A (zh) * | 2020-11-27 | 2021-03-05 | 平安普惠企业管理有限公司 | 基于多线程的数据导入方法、系统及存储介质 |
CN112445596B (zh) * | 2020-11-27 | 2024-02-02 | 上海睿量私募基金管理有限公司 | 基于多线程的数据导入方法、系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104778182B (zh) | 2018-03-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104778182A (zh) | 基于HBase的数据导入方法和系统 | |
Li et al. | A spatiotemporal indexing approach for efficient processing of big array-based climate data with MapReduce | |
US11269832B2 (en) | Application-centric object configuration | |
TWI603211B (zh) | Construction of inverted index system based on Lucene, data processing method and device | |
WO2016029026A1 (en) | Data driven relational algorithm formation for execution against big data | |
US20150227535A1 (en) | Caseless file lookup in a distributed file system | |
US20190236201A1 (en) | Techniques for processing database tables using indexes | |
Huang et al. | GeoSpark SQL: An effective framework enabling spatial queries on spark | |
CN103678491A (zh) | 一种基于Hadoop中小文件优化和倒排索引的方法 | |
WO2014110940A1 (en) | A method, apparatus and system for storing, reading the directory index | |
Gupta et al. | Faster as well as early measurements from big data predictive analytics model | |
Ramesh et al. | Data modelling for discrete time series data using Cassandra and MongoDB | |
KR101621385B1 (ko) | 클라우드 스토리지 서비스의 파일 검색 시스템 및 방법, 및 파일 제어 방법 | |
CN105069101A (zh) | 分布式索引构建及检索方法 | |
Kalavri et al. | Block sampling: Efficient accurate online aggregation in mapreduce | |
Zhang et al. | Agriculture Big Data: Research status, challenges and countermeasures | |
US9767107B1 (en) | Parallel file system with metadata distributed across partitioned key-value store | |
KR20200094074A (ko) | 인덱스 관리 방법, 장치, 기기 및 저장 매체 | |
Mittal et al. | Efficient random data accessing in MapReduce | |
Qian et al. | An evaluation of Lucene for keywords search in large-scale short text storage | |
CN106909623B (zh) | 一种支持高效海量数据分析和检索的数据装置及数据存储方法 | |
US10872103B2 (en) | Relevance optimized representative content associated with a data storage system | |
CN108121807B (zh) | Hadoop环境下多维索引结构OBF-Index的实现方法 | |
CN111008198A (zh) | 业务数据获取方法、装置、存储介质、电子设备 | |
CN109947702A (zh) | 索引构建方法及装置、电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |