)每天500w条log如何入mysql库比较靠谱



Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!



Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!

Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!




Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!

Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!

Database •  iceskysl • 于 1年前发布 • 最后由  ashchan 于 1年前回复 • 2172次阅读

我们有个产品,每天差不多500w的业务量,需要对500w做相关的分析,就需要入库~

目前用的是mysql 按月切表定期老化数据,但是导入数据情况比较糟糕~每天导入数据差不多需要20个小时,和MySQL 5000 records/second差距巨大~

尝试过三个方案:

  1. 定期解析日志,直接入库;
  2. 定期解析日志,生成sql,再直接sql入库;
  3. 生成data文件,load到库里

但是效果都不理想~ 没什么大数据处理的经验,大家支招~~~

共收到  26 条回复
19e786a2a74377ff6e052d87fd8d1fa8
xdite  1楼 , 1年前  喜欢 

你該不會是用 ActiveRecord 生成物件再儲存吧...

E9abf4a0c4ccb3e2a8828d30ef5a717c
allenwei  2楼 , 1年前  喜欢 

mysql load应该是最快的吧,把mysql引擎换成ISAM在load试试, 应该会快点
或者直接上hadoop, hive吧

22
bony  3楼 , 1年前  喜欢 

netcat,多台服务器,同步导入。。

332
vincent  4楼 , 1年前  喜欢 

第2种方法,注意每条insert可以同时插入多条记录(比如1千条),500万条数据入库,执行sql应该很快的啊,我感觉应该在几分钟可以完成。如果你的很慢那可能是环境配置或硬件的问题了,可以把问题描述得更详细些,大家好出主意。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  5楼 , 1年前  喜欢 

#1楼 @xdite 第一种方案类似的思路,但是是sinatra里用sequel入的~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  6楼 , 1年前  喜欢 

#2楼 @allenwei mysql load速度还不错,但是准备符合mysql load格式的数据还是很慢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  7楼 , 1年前  喜欢 

#3楼 @bony 感觉这个是单台性能最佳以后再横向扩展,现在我个人觉得单台性能还比较糟糕,横向解决不了根本问题~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  8楼 , 1年前  喜欢 

我正好做这方面,第一,你需要挂replication,在slave上分析就可以。
第二,你提到的“日志”,需要分析类型。是如apache log,还是业务类型。你是做数据挖掘,还是只是即时数据的展示。
第三,mysql的优化很关键,可以通过这次问题积累经验。500W数据量很小,不必担心mysql解决不了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  9楼 , 1年前  喜欢 

#4楼 @vincent 哦,sql导入的速度还不错,但是准备sql的过程比较慢,过程是这样的:
1. 准备sql文件
sqlFileName = RAILS_ROOT + "/log/insert.sql." + LOG_POSTFIX_FOR_YESTERDAY
sqlfile = File.open(sqlFileName, "w")

  1. 打开日志文件 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(",")

  1. 生成sql串
    sqlInsert = "INSERT logs_downloads.....balalaalala

  2. 写到sql文件里
    sqlfile.puts( sqlInsert )

  3. 调mysql直接导入sql

里面还有一些数据的清洗和排重工作~

每天的日志文件差不多500w行,解析生成sql的过程不理想(其中没用数据库操作)~ 难道是我磁盘性能很糟糕~~

58bf89ba2dfa037971b05d1afb0480a3
xds2000  10楼 , 1年前  喜欢 

补充一下,我是从数据仓库的角度分析你的case的。仅供参考。
http://blog.s135.com/infobright/

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  11楼 , 1年前  喜欢 

#8楼 @xds2000 还没到分析那块,现在再数据导入这个环节~infobright这个有了解,多谢~~

132640d32b693b87e139999e39250e82
lanwen  12楼 , 1年前  喜欢 

是否可以考虑生成log的时候分为多个文件?比如说app.log.20120113-1,每个文件10万条,这样你可以多任务处理

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  13楼 , 1年前  喜欢 

#12楼 @lanwen 还是没解决掉本质问题~

241737150da2cb267a59dff1e23dedc7
cxh116  14楼 , 1年前  喜欢 

既然SQL生成这里有瓶颈,那就先简单的Benchmark分析, 看那是那一块费时间.

另外可以尝试一下其它的语言,比如shell 
E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  15楼 , 1年前  喜欢 

正在Benchmark~

Ab989bfcd6ed51d34250507f7a248653
camel  16楼 , 1年前  喜欢 

#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

Dd9911c9c884c34f5afd10b46e459ef8
alvin2ye  17楼 , 1年前  喜欢 

用Ruby 合并为多条数据一起insert的SQL再导入
用 Myisam

239a70da80d3959611470d87ca8f0755
ashchan  18楼 , 1年前  喜欢 

#9楼 @iceskysl 如果跟 MySQL 无关,而是在准备 SQL 这一步(解析 LOG 文本)遇到瓶颈,直接改用 grep 来从日志中抽数据也许会快点吧?

611
Lucifer  19楼 , 1年前  喜欢 

同意楼上 可以用 awk+grep命令来分析log数据,会比用ruby解析快很多,若再不慢的话可能是你硬件问题了~~

Ab989bfcd6ed51d34250507f7a248653
camel  20楼 , 1年前  喜欢 

#18楼 @ashchan 
#19楼 @Lucifer 
能用mysql底层命令就直接用。尽量少用ruby再做一次封装。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  21楼 , 1年前  喜欢 

#18楼 @ashchan 了解,目前的思路就这样了~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  22楼 , 1年前  喜欢 

#19楼 @Lucifer 
#20楼 @camel 
了然~多谢~

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  23楼 , 1年前  喜欢 

找到原因了~ 彻底解决了~~~

239a70da80d3959611470d87ca8f0755
ashchan  24楼 , 1年前  喜欢 

#23楼 @iceskysl 分享一下原因和解决方法(案)就更好了。

E36eaf4469bba37b67aefa2f0d5277ea
iceskysl  25楼 , 1年前  喜欢 

#24楼 @ashchan

原因是我在清洗数据的时候用到了ruby的array中include?方法,而这个方法是直接遍历。。如下图
Screen-shot-2012-01-17-at-11.03.19-pm

详细的我在blog大致纪录了下:
http://www.iceskysl.com/?p=1106

239a70da80d3959611470d87ca8f0755
ashchan  26楼 , 1年前  喜欢 

#25楼 @iceskysl 不错:)谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值