我们有个产品,每天差不多 500w 的业务量,需要对 500w 做相关的分析,就需要入库~
目前用的是 mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要 20 个小时,和 MySQL 5000 records/second差距巨大~
尝试过三个方案:
但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~
第 2 种方法,注意每条 insert 可以同时插入多条记录(比如 1 千条),500 万条数据入库,执行 sql 应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。
我正好做这方面,第一,你需要挂 replication,在 slave 上分析就可以。 第二,你提到的“日志”,需要分析类型。是如 apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。 第三,mysql 的优化很关键,可以通过这次问题积累经验。500W 数据量很小,不必担心 mysql 解决不了。
#4 楼 @vincent 哦,sql 导入的速度还不错,但是准备 sql 的过程比较慢,过程是这样的:
准备 sql 文件 sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY sqlfile = File.open(sqlFileName, "w")
打开日志文件 File.open("../log/apps.log.#{LOG_POSTFIX_FOR_YESTERDAY}").each do |line|
3.提取需要的数据 id, apk_id, ip, client_id, channel_id, uniquely_code ,track = line.split(" : ")[1].split(",")
生成 sql 串 sqlInsert = "INSERT logs_downloads.....balalaalala
写到 sql 文件里 sqlfile.puts( sqlInsert )
调 mysql 直接导入 sql
里面还有一些数据的清洗和排重工作~
每天的日志文件差不多 500w 行,解析生成 sql 的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~
#15 楼 @iceskysl 建议不要用 ActiveRecord,也不要用 Mysql 的 Innodb。数据库用 mysql 的 Myisam,直接调 mysqlimport 命令,当时我 vmware 虚拟机 (主机为 i5/2g ram) 下导入 csdn >600w 条记录只要 1 分 20 秒左右。 http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html
#24 楼 @ashchan
原因是我在清洗数据的时候用到了 ruby 的 array 中 include?方法,而这个方法是直接遍历。。如下图
详细的我在 blog 大致纪录了下: http://www.iceskysl.com/?p=1106