论坛首页 Java企业应用论坛

大数据量统计

浏览 36654 次
精华帖 (2) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-13   最后修改:2009-05-13
最近在做一个统计项目的改造,对两张日志表进行分析统计,最后形成报表。这两张日志表现在每天的数据量在1亿左右,大小在30G左右,对我有用的数据大概为20G。因为这量个日志是成上升趋势的,所以我设计出来的系统应该能应对每张表2亿的数据量。

之前的做法是用了3台节点机,1台主控机,来进行统计。节点机分id段分别统计(比如node1统计id为1-5千万,node2统计5千万-1亿,1亿到1.5亿,这些都是可以配置的,并且如果数据量超过1.5亿,增加一台机器再配置一下就ok了),最后由主控机完成汇总。改造原因无非是代码很乱,出错不断,统计很耗内存等。

仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。我想起之前看过berkeley db的一些知识,berkeley db的本地文件数据库以及它的大吞吐量,很适合这个场景。

我的做法:两张日志表可以在spring中起两个job,分段读取(可以每次读50W的),每次读取到数据后把数据分给不同的handler去处理相应统计,统计的临时数据记入bdb,数据读取完毕后再分别汇总各自的数据,存入数据库。为了防止意外情况,对于月统计的临时数据入数据库。bdb的数据每天统计完了清理掉。

这样做的好处:
1.减少读写数据库的频率,我们的数据库是很多应用共用,频繁的读取数据库会对其他应用有影响。
2.充分利用本地硬盘,能够避免oom的情况。
3.还没有测试过,不过个人认为一台机器8G的内存应该就可以搞定,这样就节省了3台机器。
4.在想……

本人水平有限,欢迎有经验的同学提出宝贵意见。谢谢!
   发表时间:2009-05-14  
类似于B树的处理方式?
0 请登录后投票
   发表时间:2009-05-14  
太谦虚了。
0 请登录后投票
   发表时间:2009-05-14   最后修改:2009-05-14
引用

仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。


数据量还不是很多,就一台数据库group by ,count什么就行了。
一个晚上跑两三个小时也就出来了。

整得这么复杂
0 请登录后投票
   发表时间:2009-05-14   最后修改:2009-05-14
我没有太懂你的意思

你的意思是不通过数据库去读取数据,而是直接读取数据库文件?自己解析内容?

数据库文件同时两个程序去访问,成吗?
而且文件每时每刻都在变化
0 请登录后投票
   发表时间:2009-05-14  
超级潜水员 写道
引用

仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。


数据量还不是很多,就一台数据库group by ,count什么就行了。
一个晚上跑两三个小时也就出来了。

整得这么复杂

我们用的mysql,前面说过了,我们的数据库里面不仅仅是一个应用去连,1亿多的数据用group by,或者distinct,count的,dba真的会杀人...
0 请登录后投票
   发表时间:2009-05-15  
taupo 写道
我没有太懂你的意思

你的意思是不通过数据库去读取数据,而是直接读取数据库文件?自己解析内容?

数据库文件同时两个程序去访问,成吗?
而且文件每时每刻都在变化

可能需求我没说清楚,现在是有两张日志表,每天都会有1亿多的数据,我每天需要对前一天的日志进行统计,并且形成统计报表给老板看。由于一些原因我们是不允许用数据库的计算,比如group by和count等,但是读到内存中再去重和分类的话内存肯定不够用。遗留系统的做法就是为了避免内存不足。
0 请登录后投票
   发表时间:2009-05-15  
LZ的做法是不是把数据分时段的放入一个文件中,然后在读取文件进行汇总。如果是这样的文件的解析未必会比DB的速度快。
0 请登录后投票
   发表时间:2009-05-15  
pcwang 写道
超级潜水员 写道
引用

仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。


数据量还不是很多,就一台数据库group by ,count什么就行了。
一个晚上跑两三个小时也就出来了。

整得这么复杂

我们用的mysql,前面说过了,我们的数据库里面不仅仅是一个应用去连,1亿多的数据用group by,或者distinct,count的,dba真的会杀人...



应该查查数据仓库的概念,将生产数据库的数据每天定时导出到另外一个数据库(数据仓库中叫ODS),然后在ODS上面直接跑你的统计就行,跑完如果需要再将统计好的数据导回原有数据库。这样就对原有数据库没有影响了。

而且如果mysql有性能问题,ODS你可以使用Oracle啊.
1 请登录后投票
   发表时间:2009-05-15  
超级潜水员 写道
应该查查数据仓库的概念,将生产数据库的数据每天定时导出到另外一个数据库(数据仓库中叫ODS),然后在ODS上面直接跑你的统计就行,跑完如果需要再将统计好的数据导回原有数据库。这样就对原有数据库没有影响了。

而且如果mysql有性能问题,ODS你可以使用Oracle啊.

恩,非常感谢超级潜水员同学的建议。
之前也看过一些关于数据挖掘和数据仓库的概念,没有深入的了解过(曾经有一个。。。等到用的时候才后悔莫及。。。),恶补之。
但是公司资源有限,比如mysql换oracle这就是不可能的(不过mysql未来还是未知的,呵呵)。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics