锁定老帖子 主题:数据表每天五千四百万数据,,如何汇总
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2015-01-08
导入到HADOOP,再用PIG统计。
|
|
返回顶楼 | |
发表时间:2015-01-08
谢谢大家的回帖。。昨天比较忙。没来的及回复
|
|
返回顶楼 | |
发表时间:2015-01-08
一个java程序员 写道 这跟我做的一模一样,大数据汇总。 用的mysql, 也没什么办法。
直接内存汇总的。 汇总肯定是要查询所有的数据之后 才能计算,进行汇总操作。 4. 汇总完后,最后还有个处理过程就是,汇总结果表table2中的主键id 需要回填进 table1 对应的记录(为了表明table1的记录汇总到了table2中的某条记录)。 这个处理 感觉不好吧? 还要操作数据源表? 更新操作吗? 会不会锁表?数据那么大。 根据表中四个字段(c1,c2,c3,c4)汇总 ,无论怎么做 这个汇总条件 查出的数据 都非常的大。 好像也没什么好方法。 这么多数据内存放不下的吧。。jvm Linux上最多支持不超过3g的内存。。而且数据库的数据的大小。。封装成对象后 size 远远比数据库中的数据大。。 能不能说下你的思路 |
|
返回顶楼 | |
发表时间:2015-01-08
LinApex 写道 可以读取数据生成小数据文件,放在硬盘里,然后使用排序算法,hash切割,计算总额。
也是种思路哈。。。能具体点么? 谢谢 |
|
返回顶楼 | |
发表时间:2015-01-08
red008 写道 我理解每天4千多万条数据不是瞬间过来的。比如应该每天白天工作时间过来的数据,每个小时几百万。这样的话,汇总必须要等所有数据都过来之后进行才有意义。
那么,我认为合适的方案应该是: 1,白天按照工作时间,比如会传数据的时间是10个小时,那么按照10个小时分10个表。 第一个小时过来的数据都去第一个表,第二个小时过来的数据去第二个表,以此类推。 2,建立一个历史表,这个表你可以是按天的历史,也可以是按照周,月的历史,看你的汇总需求了。 3,第一个小时过去后,把第一个表的数据都导入历史表去,以此类推,直到下班后数据全都进入历史表里面。这样做的好处是,数据表的插入和读取是完全时间分离的,从理论上避免了死锁发生的可能性。 4,汇总统计从历史表里面抽取数据汇总,因为这时候历史表里面有今天所有的数据,所以你愿意怎么汇总就怎么汇总,根据你说的这一部分需求,应该几个SQL就搞定了吧。 5,如果你有按照周或者月汇总的需求,相应建立周汇总的历史表或者月汇总的历史表即可。这和你自己管理的总汇总记录可以互相验证,互相检查。 你可能会觉得这么大量数据插入历史表比较费时间,不过我认为你是一个小时左右去插几百万,时间完全够,而且这个插入是insert into select 小时表 的操作,全部是数据库侧的动作,会很快的。如果性能确实是问题,那么可以考虑历史表先不建立索引,最后10个小时的数据都进去之后再建立索引,这种插入速度是飞快的。 当然,如果你24小时全部有数据过来,那么我说的方案可能就不是很合适,不过如果是这样的需求话,你怎么做汇总都不会百分百精确的吧。 这个方案是根据你说的需求想的,估计你实际中有很多限制,不过我觉得应该是这个思路走下去。 汇总结果表我们是有的。。所以不需要历史表。。再说这么多数据放到同一张表中。mysql是吃不消的。。一张表的数据太大。跑起来会影响整个库的性能。。 数据的话肯定是所有都到达了。。我们是第二天凌晨跑前一天到达的所有数据。。对这么数据做汇总。。 再者单纯的写sql 对于分库分表的 系统是否合适?。。。 插入时减少索引倒是可以优化的。。 现在因为要向源数据表回写状态。 边写边读还真会发生死锁现象。。这个也是比较困惑的。。 或者真的要尝试下 map / reduce 了 |
|
返回顶楼 | |
发表时间:2015-01-08
handong890 写道 你每次汇总一定要重头到尾计算一次?不能累加么? 建一张汇总记录表不就完了?几十亿的数据 都这样过来了
是可以累加。。关键是如何累加。。一条一条去数据表中累加么。。这样速度会不会很忙。 在内存中累加是最快的方法, 但结果集内存放的下么。。。 |
|
返回顶楼 | |
发表时间:2015-01-08
引用 汇总结果表我们是有的。。所以不需要历史表。。再说这么多数据放到同一张表中。mysql是吃不消的。。一张表的数据太大。跑起来会影响整个库的性能。。
数据的话肯定是所有都到达了。。我们是第二天凌晨跑前一天到达的所有数据。。对这么数据做汇总。。 再者单纯的写sql 对于分库分表的 系统是否合适?。。。 插入时减少索引倒是可以优化的。。 现在因为要向源数据表回写状态。 边写边读还真会发生死锁现象。。这个也是比较困惑的。。 或者真的要尝试下 map / reduce 了 没听说过一个表数据量大影响数据库别的表操作性能的,顶多影响这一个表相关操作,除了汇总,你不会操作历史表,所以对你别的操作是完全没影响的(我们现在库里面有一个表里面有几亿条数据,完全没影响)。 如果有了历史表,你操作的就是单表的查询,和分库分表完全没关系了。 有了历史表,你的回写和汇总完全分离,不会发生死锁的。 另外,历史表的最重要的作用是,应对未来未知的任意汇总需求的变更,以及可以有机会检查你汇总的结果是否正确。 map/reduce对于你这种数据量是杀鸡用牛刀了。。。起码要几个T的数据量再去考虑吧。 |
|
返回顶楼 | |
发表时间:2015-01-08
可以参考map/reduce思路,只不过自己用程序实现罢了;
1. 先导出数据; 2. 拆分数据:拆分到你内存可以容纳的量,比如按照uid进行拆分,拆分N份,每份的量根据你的硬件资源决定; 3. 分块计算; 4. 合并结果; 5. 结果导入数据库; |
|
返回顶楼 | |
发表时间:2015-01-09
paulwong 写道 导入到HADOOP,再用PIG统计。
和我考虑的一样,只不过二者现在都不熟悉,能否指点下? |
|
返回顶楼 | |
发表时间:2015-01-09
red008 写道 我理解每天4千多万条数据不是瞬间过来的。比如应该每天白天工作时间过来的数据,每个小时几百万。这样的话,汇总必须要等所有数据都过来之后进行才有意义。
那么,我认为合适的方案应该是: 1,白天按照工作时间,比如会传数据的时间是10个小时,那么按照10个小时分10个表。 第一个小时过来的数据都去第一个表,第二个小时过来的数据去第二个表,以此类推。 2,建立一个历史表,这个表你可以是按天的历史,也可以是按照周,月的历史,看你的汇总需求了。 3,第一个小时过去后,把第一个表的数据都导入历史表去,以此类推,直到下班后数据全都进入历史表里面。这样做的好处是,数据表的插入和读取是完全时间分离的,从理论上避免了死锁发生的可能性。 4,汇总统计从历史表里面抽取数据汇总,因为这时候历史表里面有今天所有的数据,所以你愿意怎么汇总就怎么汇总,根据你说的这一部分需求,应该几个SQL就搞定了吧。 5,如果你有按照周或者月汇总的需求,相应建立周汇总的历史表或者月汇总的历史表即可。这和你自己管理的总汇总记录可以互相验证,互相检查。 你可能会觉得这么大量数据插入历史表比较费时间,不过我认为你是一个小时左右去插几百万,时间完全够,而且这个插入是insert into select 小时表 的操作,全部是数据库侧的动作,会很快的。如果性能确实是问题,那么可以考虑历史表先不建立索引,最后10个小时的数据都进去之后再建立索引,这种插入速度是飞快的。 当然,如果你24小时全部有数据过来,那么我说的方案可能就不是很合适,不过如果是这样的需求话,你怎么做汇总都不会百分百精确的吧。 这个方案是根据你说的需求想的,估计你实际中有很多限制,不过我觉得应该是这个思路走下去。 这位兄台提到建议感觉比较切合实际。 基于分步计算的话,其实汇总的过程可以在分表里进行一次,结果再合并后再次进行汇总。 比如可以对表1-n按照你需要的方式进行分组汇总,之后每几个表合并后分别再次汇总,以此类推。 就是不知道你汇总后能够缩减的数据量能够达到多少。 |
|
返回顶楼 | |