大数据迁移总结

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YQXLLWY/article/details/84204427

大数据迁移总结

情况是这样的,有几张表存储爬虫爬过来的数据,用text的数据类型的一个字段存储,这种表每张有2万多条数据,这样的数据库有20-30个,其中的数据还有很多是重复的,现在需要把这些数据迁移到一个库中,简单来说就是一句话:

XXXXXXXX…….

如果只是要插入数据我也认了,但是现在问题是我还要对其中的一些数据进行处理,就是我还要遍历每条数据。也就是说我一定要用脚本去实现它。

业务逻辑是简单的,就是对其中的一个字段进行替换,但是问题简单来说就是以下这些:

  • 数据量太大了,使用脚本运行时很快就报内存耗尽
  • 分布在多个库中,需要将各个库中的数据拿出来后使用脚本加入到一个库中

当时第一想法就是这玩意考的不是程序员写脚本的能力,因为你肯定可以写出处理的脚本,难点就是你的脚本服务器根本跑不动,比如你把上万条数据,每条数据还贼大的数据存储在脚本中的一个变量里,还希望他完美执行,做梦吧你,这个时候你的脚本会出现莫名其妙的错误,这里少个逗号,那里缺个冒号,这些都是轻的了,麻烦的是多给你加几个冒号之类的,你就坐着哭吧。

所以这里你写脚本的时候,不光要考虑业务的处理原则,还要兼顾服务器的性能问题,这才是难点,下面我就讲讲我的思路,当然,如果你们有更好的思路,请马上告诉我,否则我真的要完蛋了。

顺道吐槽一句,这种数据,动动脑子都知道要往mongodb里面扔啊,扔mysql,真是城里人会玩啊。

解决思路1

这个解决思路的核心就是将数据库的读与写分离,因为MySql数据库的读写相比Redis等是比较慢的,而且数据量级还那么大,所以如果你一边读,一边写,那么最终的结果就是这个进程运行时间很长,最终死在路上,据一个尝试过的同事说,他的程序跑了一个多小时,最终死在了服务器上,为他的创建的进程默哀。

所以我创建了下面的这个解决方案,当然,坑还是有的。

读写分离

首先,我的初衷就是要将读数据和写数据分开,简单来说就是先把数据从各个数据库中取出来,再来写入到统一的一个数据库中。

先来说读,读取后存储在哪里,我最初的想法就是先存在PHP的变量里,读取到一定的数量之后,组建成sql语句写入到文件中,但是很快发现内存炸了,最开始说过了,单条数据量就很大,所以一次性读取一个表中的所有数据是不可能的。

内存不足,加入分页

读取数据时加上分页操作后,的确好了很多,因为每次读取的数据少了很多,这样内存炸的可能性就少了很多,但是读取数据的时间就长了很多,而且读取的同时还要负责往文件中写入数据,这样的情况下,代码的整体运行时间就长了很多,而且在读取完数据后还要操作,更是雪上加霜了。

加快速度,Redis缓存

这个时候我想到了一个折中的办法,先从数据库中读取完数据,操作完成后,组建完部分sql语句后,不直接扔文件中,而是先扔redis中,因为毕竟是缓存类数据库,写入速度还是可以的,而且由于将内容组装成了sql语句,本质上也只是加上了几个逗号,括号之类的,量级也没有什么很大的增加,所以redis还是能缓存住的。

顺道提一句,我这里采用的redis数据结构是有序集合,因为后期还需要从redis中读取出来组建成sql文件,所以设计到顺序,就采用集合形式了。

这个时候总算艰难的将数据从很多的数据库中读取出来了,接下来就是组建完整的sql文件了。这个时候问题又来了。

操蛋的单引号与双引号

上面说了,我组建sql语句的时候,在插入的数据外只能加上单引号或者双引号,比如:

INSERT INTO `users` VALUES
("<html>这个是有效的值</html>"),
("<html style="font-size:100px">注意这里的style中的值</html>"),
('<html style='font-size:100px'>这里他娘的又变成了单引号</html>');

所以这个时候惊不惊喜,意不意外,surprise?这个是不是很绝望?我不可能将每条数据拿去正则匹配,这样代码慢的不像乌龟一样才怪。所以对于这些纨绔分子,我只能手动清理他们了,我知道这样很傻,但是我只能这样。

将数据从redis中取出来后,就是写入文件中了,由于redis是缓存型数据库,加上数据经过处理,一股脑往文件中扔就行了,肯定可以生成对应的正确的sql的,但是问题还是来了。

文件太大,难以处理,缩小单个文件大小

上面说过了,对于生成的sql文件,需要手动排错一遍,虽然这一步可以交给mysql去运行,但是人家只会告诉你出错了,也会告诉你错在哪里,问题是人家不会解决这个问题啊,所以与其出错,不如你在运行前先将sql文件排错一遍,排错方式也简单,找些数据库的图形软件,把sql粘进去,他们会自动解析的,但是这样的问题就是你粘进去的内容不能很多,否则他们也会跑不动的,这样算是最蠢,但是实在是没有办法的办法了。顺道说一句,这样的软件我推荐DataGrid

而且这里你也可以手动去掉上面的单引号与双引号的问题。

唯一的问题就是这太TM的麻烦了,如果还要我手动把sql粘进去,这样基本没有什么意义啊,所以感觉这是下下策,肯定还有更好的解决办法的。

解决思路2

上面的解决思路其实是死在了文件的单双引号上,因为包含的内容中含有HTML标签,而标签内部的单引号与双引号就是你组建sql语句时的最大的坑,这个时候你的解决思路肯定就是要将手动创建这个过程去掉,或者由一些工具来代劳,对,自己不行的时候就要交给专业的人员来解决。所以我设想出了下面这种不需要脚本,但是会耗费一些精力来手动迁移数据的解决思路。虽然还是很傻,但是总体上来感觉还是可行的。

修改老数据

上面我们说了,我们需要对老数据进行处理,既然要处理,为什么不在他们还在数据库中时直接运行sql修改好,毕竟这个时候你的运行结果肯定不会出错的。将数据处理成我们想要的格式后(就是直接导出后导入到另一个数据库中都没有问题的程序)。

删除掉一些妨碍的字段,如id

这里我们的最终目标还是读写分离,也就是不通过脚本来将数据一边拿,一边存入数据库中,我们只是将数据导出,从我们的脚本变成了一些辅助工具,这个工具下面再介绍。这里我们最常见的一个数据导入的问题就是id字段了,因为将数据导出时,会将id字段一起带上,生成sql文件时,也会将id带上,从而在插入数据时报错,所以为了避免这样的事情发生,我们需要删除掉id字段,直接修改表结构就行了,这样导出时就不会带上id字段了,生成的sql报错的可能性也小了很多。

导出数据

这里给你们介绍一个导出数据库数据的利器:Sequel Pro,虽然叫pro,但是pro也是免费的,而且一般的数据库图形界面都有这种导出功能,当然你直接跑sql命令也行,只是我一般习惯用这玩意而已。

如果你们不知道,老规矩,去blibli上搜我拍的教程:

sequel pro 导出数据

我感觉在B站上发这些的人才很少,但是我好歹还是拍了,我勇敢的拍了,真的。

好了回归正题,这个就需要你手动去调配一些数据了,但是你也可以将调配的过程用脚本实现,注意,这里是让你操作老的数据库,所以什么容量,时长等问题均不存在,简单来说就是性能与你无关,你只要安心实现你的效果就可以了,这样就简单多了。

导出数据后,再将这些sql文件导入到新的数据库中,这样就完成了,这是解决思路2,解决思路2的核心就是磨刀不误砍柴工,在踩了解决思路1的坑之后,咱们将解决问题的难点从数据转移移动到了数据解析,再来将最难的数据迁移,使用工具来实现,这样就实现了大数据的迁移。因为思路2我现在还只是设想阶段,还没有尝试,在尝试过后再来看看具体结果如何吧。

展开阅读全文

海量数据分析与Redis大数据迁移【技术讨论】

04-25

[url=http://huiyi.csdn.net/community/view/290]http://huiyi.csdn.net/community/view/290[/url]rn海量数据分析与Redis大数据迁移【技术讨论】rnrn欢迎研发人员、产品经理、项目经理、网站分析从业者和爱好者、网站运营人员、网络营销人员等等感兴趣的人来参加!rnrn[b]一、大数据迁移redis实战经验[/b]rn讲师:文承科rn介绍:战斗在一线的程序猿,目前在飞信任小兵一枚,分享一点Redis实战经验,欢迎大家来吐槽。rn内容:性能评估;容量评估;连接数;LRU过期策略;持久化评估以及容灾方案。rn[b]二、行业主题数据多维分析[/b]rn讲师:群山rn简介:稳健、高效的数据分发系统,无人值守无故障运行;ETL转换与加载系统,能够自动整理与维护数据应用;统一、严谨的数据应用监控系统,能够自动监控与捕捉数据应用异常,并定期发送数据应用监控报告;rn内容:金融相关行业主题数据多维分析,定制的应用;rn[b]三、基于java客户端的分库分表技术[/b]rn讲师:罗立树rn简介:就职京东商城,曾在阿里巴巴等电子商务公司工作过,有大规模高并发网站架构经验,做过第三方方支付架构改造,电子商务服务化方面的工作,分布式应用。rn内容:海量关系型数据处理,介绍分库分表的技术和解决方案,根据业务场景如何做分库分表的实施、实现细节和案例分析。 rn[b]四、说说程序猿们的那些倒霉事儿[/b]rn讲师:老陈rn简介:作为一名懂心理学的程序猿,目前就职于天道国际教育集团,负责企业IT建设。rn内容:未来是属于懂心理学的程序猿的,思维方式足够改变你的命运,情商能够影响你的人生。筒子们,跟老陈一起聊聊人生吧!rn[url=http://huiyi.csdn.net/community/view/290]http://huiyi.csdn.net/community/view/290[/url] 论坛

没有更多推荐了,返回首页