海量数据分析方案
电信短信话单问题:
一天大约30G的话单文件,对话单进行格式化后大约4-5G,每一条话单有主叫、被叫信息等构成;
每次新格式化一个话单文件,对文件中的号码统计主叫的频次,即该号码主叫次数
这种统计类似于实时统计,新格式化的txt格式话单文件在生成,出现一个话单文件,就需要统计下它主叫号码之前1小时、3小时、5小时、7小时,……,24小时出现的频次,频次超过规则的的形成日志
现在我们做了统计一小时的,一小时数据完全加载至内存,处理后形成日志文件,做一天的量比较大,内存等各种问题就出现了,请教各位达人有好的方案解决此问题吗
8G内存,数据库Mysql跑着其他应用,只有2太机器,目前是主被双机;public void reduce(Text key, Iterator<FloatWritable> values, OutputCollector<Text, FloatWritable> output,Reporter reporter) throws IOException
里面的。
前面有人给的意见非常好,Hadoop的确是完成这个任务最好的选择,但是前提是,有好几台机器。2台机器,而且因为还有应用在跑,要节省IO,Hadoop损失的性能比取得还要小,毕竟Job Tracker, Tash Tracker, Name Node这些组件也很耗资源的。。。
Map & Reduce只是一个算法。 25 楼 helian 2009-11-22 有好几台机器,用不用hadoop还有啥关系,楼主自己写程序也能完成任务了。 26 楼 fallen_lord 2009-11-22 用sed+sort+uniq+grep不是就可以完成所有前置数据提取工作了吗?效率也高。。4、5G这种小数据量也就几分钟吧,为啥搞那么麻烦。。。 27 楼 helian 2009-11-22 helian 写道有好几台机器,用不用hadoop还有啥关系,楼主自己写程序也能完成任务了。
能说详细点么? 28 楼 baseworld 2009-11-22 Laynepeng 写道niumd 写道数据库跑着其他应用,只能利用本地硬盘,以文件处理,分析过的数据直接以文件压缩转移到磁阵;
估计了下大约有3-4亿数据
没看到你说的Mysql在做其它应用。。。
那你们的环境也真是恶劣啊。。。
Hadoop可以放弃了,2个Node的话损失的性能比得到还要少,Hadoop只不过是提供个通用框架给你拆分应用而已,少数nodes的话,它提供的性能不高的,只是当nodes多到一定程度,例如10个左右,他的优势才能体现出来。
而且既然Mysql在跑应用,那IO肯定不能大量的吃了。。。
Hadoop是官方的解决,但你可以山寨搞好了,还是一个一个小时统计(Map),然后汇总计算吧(Reduce),:)。。。
3-4亿不多的。。。我们的实验室里面跑的都是TB级的数据。。。
你确定你试过?我们这5(4dn)个节点的性能大概是一个节点的2.5倍,如果采用压缩后性能还能提高。
@LZ
当然这种需求不用hadoop也比较好做。 29 楼 Laynepeng 2009-11-22 baseworld 写道Laynepeng 写道niumd 写道数据库跑着其他应用,只能利用本地硬盘,以文件处理,分析过的数据直接以文件压缩转移到磁阵;
估计了下大约有3-4亿数据
没看到你说的Mysql在做其它应用。。。
那你们的环境也真是恶劣啊。。。
Hadoop可以放弃了,2个Node的话损失的性能比得到还要少,Hadoop只不过是提供个通用框架给你拆分应用而已,少数nodes的话,它提供的性能不高的,只是当nodes多到一定程度,例如10个左右,他的优势才能体现出来。
而且既然Mysql在跑应用,那IO肯定不能大量的吃了。。。
Hadoop是官方的解决,但你可以山寨搞好了,还是一个一个小时统计(Map),然后汇总计算吧(Reduce),:)。。。
3-4亿不多的。。。我们的实验室里面跑的都是TB级的数据。。。
你确定你试过?我们这5(4dn)个节点的性能大概是一个节点的2.5倍,如果采用压缩后性能还能提高。
@LZ
当然这种需求不用hadoop也比较好做。
5个Nodes和2个Nodes不是一个等级的,如果是2个Nodes你觉得应该怎么配置?
我的确没有是过10个Nodes以下使用Hadoop,呵呵~我这边预算不是问题,而且数据量也真的比较大。
之前有看过一份性能报告,但是找不到了,:P
但是从Yahoo的tutorial可以看出,
http://developer.yahoo.com/hadoop/tutorial/module7.html#config-small
2-10 Nodes是Small Cluster,用在开发的情况下比较多。。。
当然,我不怀疑当Nodes大于3的情况下性能比单Node高。。。 30 楼 baseworld 2009-11-22 Laynepeng 写道baseworld 写道Laynepeng 写道niumd 写道数据库跑着其他应用,只能利用本地硬盘,以文件处理,分析过的数据直接以文件压缩转移到磁阵;
估计了下大约有3-4亿数据
没看到你说的Mysql在做其它应用。。。
那你们的环境也真是恶劣啊。。。
Hadoop可以放弃了,2个Node的话损失的性能比得到还要少,Hadoop只不过是提供个通用框架给你拆分应用而已,少数nodes的话,它提供的性能不高的,只是当nodes多到一定程度,例如10个左右,他的优势才能体现出来。
而且既然Mysql在跑应用,那IO肯定不能大量的吃了。。。
Hadoop是官方的解决,但你可以山寨搞好了,还是一个一个小时统计(Map),然后汇总计算吧(Reduce),:)。。。
3-4亿不多的。。。我们的实验室里面跑的都是TB级的数据。。。
你确定你试过?我们这5(4dn)个节点的性能大概是一个节点的2.5倍,如果采用压缩后性能还能提高。
@LZ
当然这种需求不用hadoop也比较好做。
5个Nodes和2个Nodes不是一个等级的,如果是2个Nodes你觉得应该怎么配置?
我的确没有是过10个Nodes以下使用Hadoop,呵呵~我这边预算不是问题,而且数据量也真的比较大。
之前有看过一份性能报告,但是找不到了,:P
但是从Yahoo的tutorial可以看出,
http://developer.yahoo.com/hadoop/tutorial/module7.html#config-small
2-10 Nodes是Small Cluster,用在开发的情况下比较多。。。
当然,我不怀疑当Nodes大于3的情况下性能比单Node高。。。
比较好奇你们集群多大?
31 楼 hocus 2009-11-22 估计lz 在做 欺诈检测,对付广告群发的。
这个数据量不大。毕竟只是短信话单。
话单预处理:
话单文件是周期ftp过来的。
db本身有压力,入库再通过数据库统计多此一举,所以原始话单不需要入库。处理完即可归档。
java来做文本格式化处理是比shell低效文本处理应该交给linux 的corn job 和脚本来做。
在这里可以将话单文件按时段拆分,统计,产生结果文件。结果里应该包含,话单文件名,话单文件时间段,某号码共发了几条短信。这些处理过的文本,是下一步统计的数据基础。不把所有的话单数据入库,或者是放入java虚拟机里处理,才是性能的关键。linxu下perl或python做这个比java强太多了。
这部分功能应该是独立的。
话单处理程序:
对每一个号码都需要记录其发送数,北京移动用户有多少,假设5千万吧。实际应该达不到。
我倾向于用表记录号码和单位时间内的对应发送数目。(也可能有人倾向于用文本。也不反对。))
表毫无疑问应该分表存储,提高效率。比如 Tb13636xxxxx 最多存放十万条数据。5千万用户,这样表有500张。
字段 为号码信息,当前时间,之前1小时、3小时、5小时、7小时,……,24小时的发送数目。字段不过百,不算多。
注意这个字段是针对最后一次更新时间的。
每处理完一个文本文件,(不是处理完一个号码),就对统计表进行 遍历更新。
我们称这个表为 发送数统计表
另外还需要有个表来和记录 某时段 某号码 的条短信在那个文件内。
暂且叫做 号码和话单文件对照表,这个表是流水表,数据也算多了,应该按照时间来分表。超过24小时就可以drop了。
这里可以用多线程程序对多个文本文件同时处理,要做好控制。
必要的时候,做个简单队列。
后台统计程序:后台统计程序应该是daemon类程序,实时(不完全,只是周期很短)对发送数统计表里的号码统计数据进行统计。对超标的号码产生统计报告。或许这个完全可以通过存储过程或者触发器来完成。看移动给不给你们这个权利了。
前台即席查询,top100发送时候,就直接读取 发送统计表。
当 要看 指定号码的发送记录时,再根据查询的时间段,查询 号码和话单文件对照表 ,找出对应话单文件,读取话单内容。
32 楼 hocus 2009-11-22 1 因为分析型系统要通过boss的采集系统来取话单文件,处理的话单数据都比当前时间早
此外,采集系统也是周期产生话单文件的,本身就不是实时的
2 话单数据文件名是有规律的,处理时候可以先处理早的再处理晚的。
综上
2009-11-22 22:13 的话单文件出现时候,计算机时间肯定比 这个时间要晚,假设计算机时间是 2009-11-22 22:30分,那么这个2009-11-22 22:13的文件中的记录,应该归为 之前1小时的 33 楼 Jwind 2009-11-22 难道LZ在进你现在公司的时候,老板没跟你讲保密的规定吗?
你这样的话题不应该拿出来说,把问题抽离出来,换个其他方式提或许更好。 34 楼 hocus 2009-11-22 Jwind 写道难道LZ在进你现在公司的时候,老板没跟你讲保密的规定吗?
你这样的话题不应该拿出来说,把问题抽离出来,换个其他方式提或许更好。
呵呵,这些算什么
lz一没有透露真实用户信息,二没有发布机密文档,三没有透露厂商信息
我告诉你些秘密
移动联通会定期随机抽样将客户短信明文上报国安局。以后发短信小心些呦。不光是qq的聊天室会对关键字言论做筛查的。
那些做boss系统的,能接触到真实客户资料和话单信息
无聊的时候能在数据库里统计 某领导和哪个异性通话频次最高 这才算有些违规
至于帮老婆的帐号延长 充值有效期 那也是毛毛雨了。
35 楼 case0079 2009-11-23 Jwind 写道
无聊的时候能在数据库里统计 某领导和哪个异性通话频次最高
36 楼 addjava 2009-11-23 留个脚印.呵呵. 37 楼 抛出异常的爱 2009-11-23 把每小时的数据读入内存如有重复 合并 并次数增加
形成 小时-次数-业务类型 文件.
合并三个这样的文件形成
3小时次数业务类型文件每小时多作一个
合并五个这样的文件形成
5小时次数业务类型文件每小时多作一个
合并二个3小时加一个小时
7小时次数业务类型文件每小时多作一个
每次的显示数据都是由以上文件加上在内存中的数据型成的. 38 楼 dmewy 2009-11-24 每一小时通过文件去导入数据.(只导.不复杂计算)
再停留几分钟起个批次用DB去计算 统计主叫的频次
做一个translog表去记录每个批次的时间,很容易就可以抓到每个批次传输进来的数据了.