锁定老帖子 主题:大数据量统计
精华帖 (2) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-13
最后修改:2009-05-13
之前的做法是用了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.在想…… 本人水平有限,欢迎有经验的同学提出宝贵意见。谢谢! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-14
类似于B树的处理方式?
|
|
返回顶楼 | |
发表时间:2009-05-14
太谦虚了。
|
|
返回顶楼 | |
发表时间:2009-05-14
最后修改:2009-05-14
引用 仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。 数据量还不是很多,就一台数据库group by ,count什么就行了。 一个晚上跑两三个小时也就出来了。 整得这么复杂 |
|
返回顶楼 | |
发表时间:2009-05-14
最后修改:2009-05-14
我没有太懂你的意思
你的意思是不通过数据库去读取数据,而是直接读取数据库文件?自己解析内容? 数据库文件同时两个程序去访问,成吗? 而且文件每时每刻都在变化 |
|
返回顶楼 | |
发表时间:2009-05-14
超级潜水员 写道 引用 仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。 数据量还不是很多,就一台数据库group by ,count什么就行了。 一个晚上跑两三个小时也就出来了。 整得这么复杂 我们用的mysql,前面说过了,我们的数据库里面不仅仅是一个应用去连,1亿多的数据用group by,或者distinct,count的,dba真的会杀人... |
|
返回顶楼 | |
发表时间:2009-05-15
taupo 写道 我没有太懂你的意思
你的意思是不通过数据库去读取数据,而是直接读取数据库文件?自己解析内容? 数据库文件同时两个程序去访问,成吗? 而且文件每时每刻都在变化 可能需求我没说清楚,现在是有两张日志表,每天都会有1亿多的数据,我每天需要对前一天的日志进行统计,并且形成统计报表给老板看。由于一些原因我们是不允许用数据库的计算,比如group by和count等,但是读到内存中再去重和分类的话内存肯定不够用。遗留系统的做法就是为了避免内存不足。 |
|
返回顶楼 | |
发表时间:2009-05-15
LZ的做法是不是把数据分时段的放入一个文件中,然后在读取文件进行汇总。如果是这样的文件的解析未必会比DB的速度快。
|
|
返回顶楼 | |
发表时间:2009-05-15
pcwang 写道 超级潜水员 写道 引用 仔细的分析了一下需求,其实逻辑不复杂,基本就是根据不同的字段来分段,去重,count等,这样的数据量显然不能直接用sql去group by,count什么的。 数据量还不是很多,就一台数据库group by ,count什么就行了。 一个晚上跑两三个小时也就出来了。 整得这么复杂 我们用的mysql,前面说过了,我们的数据库里面不仅仅是一个应用去连,1亿多的数据用group by,或者distinct,count的,dba真的会杀人... 应该查查数据仓库的概念,将生产数据库的数据每天定时导出到另外一个数据库(数据仓库中叫ODS),然后在ODS上面直接跑你的统计就行,跑完如果需要再将统计好的数据导回原有数据库。这样就对原有数据库没有影响了。 而且如果mysql有性能问题,ODS你可以使用Oracle啊. |
|
返回顶楼 | |
发表时间:2009-05-15
超级潜水员 写道 应该查查数据仓库的概念,将生产数据库的数据每天定时导出到另外一个数据库(数据仓库中叫ODS),然后在ODS上面直接跑你的统计就行,跑完如果需要再将统计好的数据导回原有数据库。这样就对原有数据库没有影响了。
而且如果mysql有性能问题,ODS你可以使用Oracle啊. 恩,非常感谢超级潜水员同学的建议。 之前也看过一些关于数据挖掘和数据仓库的概念,没有深入的了解过(曾经有一个。。。等到用的时候才后悔莫及。。。),恶补之。 但是公司资源有限,比如mysql换oracle这就是不可能的(不过mysql未来还是未知的,呵呵)。 |
|
返回顶楼 | |