基于HBase的数据导入方法和系统的制作方法_2

文档序号:8457281阅读:来源:国知局
e的数据导入方法还包括步骤:文件处理线程验证文件的完整性,若文件不完整,则将文件移到错误处理目录,由该文件等待进一步的处理,若文件完整,则进入到读取文件为文件流的步骤。文件处理线程可计算文件的信息摘要值(如md5值),根据信息摘要值验证文件的完整性。本实施中,在对文件进行处理前,先验证文件的完整性,可避免文件不完整性而导致文件处理过程出错。
[0062]在一个实施例中,读取文件为文件流的步骤为:根据文件的文件名后缀选取对应的算法读取文件为文件流。文件名后缀包括gz、Zip等,文件名后缀可表征文件类型,不同的文件名后缀代表不同的文件类型。本实施例中,可智能地选择相应算法读取不同类型的文件为文件流,从而可提高方法的可移植性。
[0063]步骤S106,文件处理线程将文件流中的行数据转换为json对象。
[0064]JSON (JavaScript Object Notat1n)是一种轻量级的数据交换格式,本文件中的json对象可理解为一种“名称/值”对的集合。
[0065]在一个实施例中,文件处理线程可执行转化器,通过转化器将文件流中的行数据转换为json对象。转化器为用户将文件流中的行数据转换为json对象的函数或功能模块。
[0066]在一个实施例中,在步骤S106之前,上述基于HBase的数据导入方法还包括:对文件流中的行数据进行预处理。文件流中的每一行数据都构成一条行数据。对文件流中的行数据进行预处理包括以下步骤:
[0067](I)校验行数据中是不包含指定的列名,根据校验结果判断行数据是否有效。若行数据中不包含指定的列名,则判定行数据无效,并将无效的行数据删除。
[0068](2)根据预设的列名与列值的映射关系给行数据中没有对应列名的列值补充列名。文件流中的行数据包括多对列名与列值。列名与对应的列值之间用冒号隔开,两对列名与列值之间用逗号隔开。若行数据中某一列值没有对应的列名,则根据预设的列名与列值的映射关系查询该列值对应的列名,将查找到的列名在行数据中补充为该列值对应的列名。
[0069](3)按照预设逻辑根据行数据中指定的列值计算新增加的列名和列值。原始行数据中的信息量有限,有时需要根据原始行数据增加额外的列名和列值。
[0070](4)删除行数据中指定的无效数据。
[0071]步骤S108,文件处理线程根据json对象构造HBase的Row对象。
[0072]Row是HBase的通用的应用程序接口,用于操作HBase中的行数据。
[0073]在一个实施例中,文件处理线程可将转换而成的json对象传给用于根据json对象构造HBase的Row对象的函数并执行该函数,例如可命名用于构造HBase的Row对象的函数为cacheRow函数。
[0074]如图2所示,在一个实施例中,根据json对象构造HBase的Row对象的步骤包括:
[0075]步骤S202,根据json对象构造Row对象的行键。
[0076]在一个实施例中,步骤S202包括:从行键构造规则配置文件中读取json对象中的表名对应的行键构造规则;根据读取的行键构造规则以及json对象中的键值对构造Row对象的行键。
[0077]行键构造规则配置文件中保存了预先配置的各个表名对应的行键构造规则。行键构造规则配置文件命名为rowkey.1ni。步骤S202可首先从rowkey.1ni中查找json对象中的表名对应的行键构造规则,若查找失败,则可从保存默认行键构造规则的文件(命名为global, ini)中读取默认行键构造规则。
[0078]例如,原始行数据为:
[0079]{"_tnm": "user_order", "_plat": 〃 1000","_uid": "1000","1386959448","pid":"10000000","blindmin_5":"100","blindmin_10":"60","blindmin_50〃:〃20〃......},json对象所包含的数据内容与行数据的数据内容相同;
[0080]读取的行键构造规则为:
[0081]user_order={"fields":{"_plat":5, "_uid":10, "_tm":10, "pid":10},"reverse":true, "lin e—num":false}。其中:
[0082]user_order表示该行键构造规则对应的表名,从行数据中的_tnm列名对应的列值获取。
[0083]fields所包括的数据项表示行键由哪些列组成,每个列的长度为多少。该例中的行键由_plat、_uid、_tm和pid这四个列组成。例如,_plat的长度为5位字符,如果长度不足5位,则在值前面补0,该例中的_plat转换后为01000。组成行键其他列的构成规则相同。
[0084]reverse表示原始行数据中的时间戳是否需反转,true表示反转。该例的时间戳为9999999999-1386959448=8613040551。由于HBase存储是按字典序排序,时间早的数据排在前面,而在业务系统中,最新数据的查找频率比较大。将时间戳反转一下,可使最新的数据排在前面,从而提高查询速度。
[0085]line_num表示rowkey是否要添加行号,false表示不添加。行号为行数据在文件中的行位置。由于时间戳只精确到秒,同一秒内同一个用户可能会有多条操作记录,而在hbase中,相同rowkey的记录会被新纪录覆盖,在每个rowkey中添加该行的行号可以避免这个问题。
[0086]根据上面行数据以及行键构造的规则,可构造行键为:
[0087]rowkey=_plat+_uid+(9999999999__tm)+pid=01000000000100086I30405510010000000。
[0088]步骤S204,将构造的行键作为Row对象的主键初始化Row对象。
[0089]步骤S206,根据json对象构造初始化成功的Row对象的键值对。
[0090]在一个实施例中,步骤S206包括:根据json对象中的表名查找对应的列类型配置文件;将json对象中的列值转换成其对应列名在列类型配置文件中对应的列类型的值;将经过类型转换的列值转化成字节数组;将列名与对应的列值构成键值对保存到初始化成功的Row对象中。
[0091]列类型配置文件为xml文件,以“表名.xml”命名。以上例为基础,列类型配置文件为use_order.xml。列类型配置文件中描述列名对应的列类型。Row对象中的列名对应的列值的类型需要与列类型配置文件中列名对应的列类型一致。因此,可查找json对象中的列名在列类型配置文件中对应的列类型,将该列名在json对象中对应的列值的类型转换为其在列类型配置文件中对应的列类型。
[0092]上述基于HBase的数据导入方法,采用行键构造规则配置文件保存配置的行键构造规则,自动根据行键构造规则构造行键,并采用列类型配置文件保存配置的列名对应的列类型,自动根据列类型配置文件中列名对应的列类型转换json对象中列值的类型,可使方法的通用性得到增强。
[0093]步骤SI 10,存储线程将构造的Row对象导入HBase中。
[0094]存储线程可触发用于将构造的Row对象导入HBase中的函数(例如,可命名该函数为submit函数),通过该函数将构造的Row对象导入HBase中。
[0095]在一个实施例中,在步骤S108之后,上述基于HBase的数据导入方法还包括步骤:文件处理线程将构造的Row对象保存到缓存池。在一个实施例中,文件处理线程将构造的Row对象保存到缓存池包括以下步骤:根据预先配置的分表规则以及Row对象中的表名计算Row对象对应的分表名;将Row对象保存到缓存池中其分表名对应的列表中。
[0096]具体的,可从分表配置文件中读取Row对象的表名对应的分表规则。分表配置文件命名为split, ini。例如,分表规则为:user_order=m, 100, _plat ;其中表示取模,100表示模除值,_plat表示被取模的列名,以上述行数据内容(Row对象的数据内容与行数据内容相同)为例,_plat对应的列值为1000,1000%100=0,则Row对象对应的分表名=user_orderj)。采用分表配置文件保存配置的分表规则,自动根据分表规则计算分表名,可使上述基于HBase的数据导入方法的通用性得到增强。
[0097]进一步的,可在缓存池中查找Row对象的分表名对应的列表,若未查找到,则建立分表名对应的列表;进一步的,将Row对象添加到其分表名对应的列表中。图3为一个实施例中的Row对象缓存不意图。其中,user_order_0、…user_order_n和user_login_0为分表名;row即为row对象;每个row对象包含行键(!■0?1^50以及多个键值对(1^5^31110),各个表名及其对应的row对象构成map集合存储在缓存池中。
[0098]本实施中,步骤SllO包括以下步骤:存储线程监听缓存池数据量大小,当缓存池数据量大小达到阈值时,将缓存池中的Row对象导入HBase中,重置缓存池。
[0099]具体的,可获取缓存池中的所有分表名,对应每个分表名实例化一个HTable对象,将缓存池中各分表名对应的Row对象列表通过无锁机制批量导入HBase中分表名对应的HTable对象。无锁机制可保证多线程快速存储数据的要求。进一步的,HB
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1