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

文档序号:8457281阅读:来源:国知局
ase可将导入的数据写入其缓冲区memstore ;当缓冲区数据量达到阈值后,将缓冲区数据写入HFile文件;而当HFile文件数量达到预设数量时,将HFile文件合并成一个大的HFile文件;进一步的,返回写入结果。
[0100]本实施例将构造的Row对象保存到缓存池中,当缓存池数据量大小达到阈值时,将缓存池中的Row对象导入HBase中,可减少与HBase进行RPC通讯的次数,从而提高整体的数据导入速度。
[0101]在一个实施例中,上述基于HBase的数据导入方法还包括步骤:验证线程校验HBase返回的写入结果,若发生写入错误,则记录错误发生的行数据、行数据所在文件的文件名及行数据在文件中的行号。
[0102]本实施例采用验证线程校验HBase返回的写入结果,验证线程可与其它线程并发工作,从而提高处理速度;另外,本实施例还记录错误发生的行数据、行数据所在文件的文件名及行数据在文件中的行号,数据准确度精确到行,从而提高了数据存储的精确度。
[0103]图4为一个实施例中的基于HBase的数据导入方法的流程示意图。如图4所示,一种基于HBase的数据导入方法包括以下步骤:
[0104]步骤S401,从文件压缩池中提取文件。
[0105]步骤S402,验证文件的md5完整性,若不完整,则执行步骤S403,若完整,则执行步骤S404。具体的,可计算文件的md5值,根据md5值验证文件的完整性。
[0106]步骤S403,将文件移到错误处理目录。
[0107]步骤S404,根据文件的文件名后缀选取对应的算法读取文件为文件流。
[0108]步骤S405,将文件流中的行数据转换为json对象。
[0109]步骤S406,根据json对象构造HBase的Row对象。可结合配置的或默认的行键构造规则以及配置的列类型构造Row对象。
[0110]步骤S407,将Row对象保存到缓存池。可根据配置的分表规则以及Row对象中的表名计算Row对象对应的分表名;将Row对象保存到缓存池中其分表名对应的列表中。
[0111]步骤S408,当缓存池数据量大小达到阈值时,将缓存池中的Row对象导入HBase中。
[0112]步骤S409,校验HBase返回的写入结果,若有写入错误,则执行步骤S410,若无写入错误,则执行步骤S411。
[0113]步骤S410,记录错误发生的行数据、行数据所在文件的文件名及行数据在文件中的行号。
[0114]步骤S411,重置缓存池。
[0115]其中步骤S401?S407可由文件处理线程执行,步骤S408可由存储线程执行,步骤S409?S410可由验证线程执行,步骤S411可由存储线程执行。
[0116]如图5所示,在一个实施例中,一种基于HBase的数据导入系统,包括文件名提取模块10、文件读取模块20、json对象转换模块30、Row对象构造模块40、数据导入模块50和控制模块80,其中:
[0117]控制模块80用于启动文件名提取线程执行文件名提取模块10,启动文件处理线程执行文件读取模块20、json对象转换模块30和Row对象构造模块40,以及启动存储线程执行数据导入模块50。
[0118]文件名提取模块10用于提取文件压缩池中新上报文件的文件名,将提取的文件名存放到无读写锁的队列。
[0119]文件压缩池为文件存储空间。无读写锁的队列为读写队列中数据不需要加解读写锁的队列;无读写锁的队列可保证线程安全,线程安全指的是在多个线程并发读写队列中数据时不出现错误。
[0120]在一个实施例中,可由日志中心等文件产生方上报文件到文件压缩池。文件名提取模块10可实时监测文件压缩池中是否有新上报的文件,当文件压缩池中有新上报的文件时,提取新上报文件的文件名。
[0121]文件读取模块20用于从队列中获取文件名,从文件压缩池中提取文件名对应的文件,读取文件为文件流。
[0122]在一个实施例中,上述基于HBase的数据导入系统还包括完整性验证模块(图中未示出)。控制模块80还用于启动文件处理线程执行验证模块。验证模块用于在读取文件为文件流之前,验证文件的完整性,若文件不完整,则将文件移到错误处理目录,由该文件等待进一步的处理,若文件完整,则启动文件读取模块20读取文件为文件流。文件处理线程可计算文件的信息摘要值(如md5值等),根据信息摘要值验证文件的完整性。本实施中,在对文件进行处理前,先验证文件的完整性,可避免文件不完整性而导致文件处理过程出错。
[0123]在一个实施例中,文件读取模块20可根据文件的文件名后缀选取对应的算法读取文件为文件流。文件名后缀包括gz、zip等,文件名后缀可表征文件类型,不同的文件名后缀代表不同的文件类型。本实施例中,可智能地选择相应算法读取不同类型的文件为文件流,从而可提高系统的可移植性。
[0124]json对象转换模块30用于将文件流中的行数据转换为json对象。
[0125]在一个实施例中,上述基于HBase的数据导入系统还包括转换预处理模块(图中未示出),用于在将文件流中的行数据转换为json对象之前,对文件流中的行数据进行预处理。文件流中的每一行数据都构成一条行数据。对文件流中的行数据进行预处理的过程包括:
[0126](I)校验行数据中是不包含指定的列名,根据校验结果判断行数据是否有效。若行数据中不包含指定的列名,则判定行数据无效,并将无效的行数据删除。
[0127](2)根据预设的列名与列值的映射关系给行数据中没有对应列名的列值补充列名。文件流中的行数据包括多对列名与列值。列名与对应的列值之间用冒号隔开,两对列名与列值之间用逗号隔开。若行数据中某一列值没有对应的列名,则根据预设的列名与列值的映射关系查询该列值对应的列名,将查找到的列名在行数据中补充为该列值对应的列名。
[0128](3)按照预设逻辑根据行数据中指定的列值计算新增加的列名和列值。原始行数据中的信息量有限,有时需要根据原始行数据增加额外的列名和列值。
[0129](4)删除行数据中指定的无效数据。
[0130]Row对象构造模块40用于根据json对象构造HBase的Row对象。
[0131]在一个实施例中,Row对象构造模块40可将转换而成的json对象传给用于根据json对象构造HBase的Row对象的函数并执行该函数,例如可命名用于构造HBase的Row对象的函数为cacheRow函数。
[0132]如图6所示,在一个实施例中,Row对象构造模块40包括行键构造模块402、Row对象初始化模块404和键值对构造模块406,其中:
[0133]行键构造模块402用于根据json对象构造Row对象的行键。
[0134]在一个实施例中,行键构造模块402包括规则读取单元和行键构造单元(图中未示出)。规则读取单元用于从行键构造规则配置文件中读取json对象中的表名对应的行键构造规则,行键构造单元用于根据读取的行键构造规则以及json对象中的键值对构造Row对象的行键。
[0135]行键构造规则配置文件中保存了预先配置的各个表名对应的行键构造规则。规则读取单元可首先从行键构造规则配置文件中查找jS0n对象中的表名对应的行键构造规贝U,若查找失败,则可从保存默认行键构造规则的文件中读取默认行键构造规则。
[0136]Row对象初始化模块404用于将构造的行键作为Row对象的主键初始化Row对象。
[0137]键值对构造模块406用于根据j son对象构造初始化成功的Row对象的键值对。
[0138]在一个实施例中,键值对构造模块406包括配置文件查找单元、列值转换单元、数组生成单元和键值对保存单元(图中未示出)。配置文件查找单元用于根据json对象中的表名查找对应的列类型配置文件,列值转换单元用于将json对象中的列值转换成其对应列名在列类型配置文件中对应的列类型的值,数组生成单元用于将经过类型转换的列值转化成字节数组,以及键值对保存单元用于将列名与对应的列值构成键值对保存到初始化成功的Row对象中。
[0139]在一个实施例中,列类型配置文件为xml文件,以“表名.xml”命名。列类型配置文件中描述列名对应的列类型。Row对象中的列名对应的列值的类型需要与列类型配置文件中列名对应的列类型一致。因此,键值对构造模块406可查找json对象中的列名在列类型配置文件中对应的列类型,将该列名在json对象中对应的列值的类型转换为其在列类型配置文件中对应的列类型。
[0140]上述基于HBase的数据导入系统,采用行键构造规则配置文件保存配置的行键构造规则,自动根据行键构造规则构造行键,并采用列类型配置文件保存配置的列名对应的列类型,自动根据列类型配置文件中列名对应的列类型转换json对象中列值的类型,可使方法的通用性得到增强。
[0141]数据导入模块50用于将构造的Row对象导入HBase中。
[0142]如图7所示,在一个实施例中,上述基于HBase的数据导入系统还包括数据缓存模块60。控制模块80还用于启动文件处理线程执行数据缓存模块60。数据缓存模块60用于将构造的Row对象保存到缓存池。在一个实施例中,数据缓存模块60根据预先配置的分表规则以及Row对象中的表名计算Row对象对应的分表名,将Row对象保存到缓存池中其分表名对应的列表中。
[0143]具体的,数据缓存模块60可从分表配置文件中读取Row对象的表名对应的分表规贝U
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1