不同hive集群中基于表的数据一致性比对

    前阵子博主遇到一个需求,因对hadoop集群进行数据迁移,数据迁移完毕后进行两个hive库的数据一致性的比对,不仅对源表数据进行比对,而且要同时使用两个集群加工相同数据,对加工后的数据进行数据一致性比对。
    博主已知的数据迁移方法有两种,第一种就是hadoop distcp功能来进行集群间数据的复制,那么基本就不用做源表的数据验证了,集群间数据复制失败会报错提示。
    第二种方法就是数据的导入导出了,把原集群数据使用get命令导出至本地,把数据复制至新集群节点下,并把数据load至集群,虽然这种方法过程复杂,效率低下,工作量大,但是在某些情况下(新老集群网络不通或者带宽很低),还只能是唯一的选择。而这种方法在数据传输过程中产生数据丢失的可能性就会大大增加。
    不论使用的是这两种方式的哪一种,为确保数据不产生丢失,都要进行数据一致性的验证。
    大家都知道MD5文件校验工具(不知道的自己百度去),如果使用的是第二种方法进行集群间数据的迁移,那么可以在数据导出完毕后对文件进行一次MD5校验,当数据复制至新集群本地后,在数据入库之前做一次MD5文件校验,对同一文件产生的校验码进行比对,确保数据传输过程中数据不会丢失。那么问题来了,加工后的中间表数据一致性如何比对?而且对于第二种数据迁移方式来说,只能确保数据传输过程中不会产生数据丢失,但是数据导入导出的过程呢?如何确保?

    为此博主想到了以前用过的hive表数据的导出,是不是可以使用对表数据进行MD5校验的方式来实现呢?

     那么说做就做,博主做了一个小实验,对于两个CHD版本不同的集群,把一份相同的数据load至hive表中,以下是使用hive进行数据导出并验证MD5过程:

     测试用表主要字段介绍:

    表名:部门表

    主要字段:月份,部门标识,部门名称,归属地域编码,归属省份编码,部门管理者,起始有效时间,终止有效时间等

    对于两个CHD版本不同的集群,以下简称集群1,集群2,均含有部门表,理论上该部门表数据量及内容是相同的

    hive数据导出,博主是使用hive命令导出的方法,以下是导出sql(集群1):

       hive -e "use source;select * from c01060_depart_201803 where province_code=11 order by depart_id;" >user_base.txt

    根据部门标识进行排序是为了防止数据导出过程中数据所属行发生变化导致MD5数据验证失败(部门标识唯一不重复)

    以下是集群二数据导出以及对文件进行MD5数据验证截图

           

    以下是集群二数据导出以及对文件进行MD5数据验证截图

            

    从截图中可以看出,两个集群中所添加的条件不太相同,这就相当于数据加工的过程,取出的都是3月份表中所属省份标识为11的部门数据,截图可以看出两个集群的导出记录条数相同,导出文件的校验值相同,由此确保两张表中3账期并且省份标识为11的数据是完全一致的。

    了解过MD5原理的同学知道,两个文件中数据哪怕相差一个字符,亦或者行的位置调换,都会导致文件校验值产生变化,所以,这可以说是最严谨的一种验证方式了。但是这种验证方式有它自己的局限性:此种验证方式适合与验证数据量不大的表,对于数据量极大的表,排序速度极慢,导出时还会受制于linux网络以及磁盘IO限制。

    希望本文对您能有所帮助,如果您有更好的验证方式,也请不吝告知,谢谢!




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值