海量数据算法:如何从超过10G的记录IP地址的日志中,较快的找出登录次数最多的一个IP?这种海量数据中找出出现次数最多的一项,这类问题如何解现在网上的答案通常
采样随机位置从样本里取出10块数据,每块数据1k,数据块之间不重合。
然后统计一下这10块数据中哪个IP地址出现的次数最多即可。
10g的日志,应该是文本类型的。10g的文本文件遍历一遍基本上必须的。逐行读取,正则匹配出IP地址转行成数字类型,变成数组,读取每一行都判断数组中是否存在,如果有计数器加一,如果没有新建一个。虽然有一些算法可以减少遍历,比如在遍历到超过一半之后,如果发现有IP超过了总数的一半儿,后面就不需要遍历了,比如剩余30%之后,所有跟第一名差距超过30%的可以都不计数了,但是这种情况基本在最后才会遇见,判断的时间超过计数器的时间。性价比最好的就是遍历一般计数器来实现。
网上的答案需要十几分钟是什么答案?能阐述一下吗?
存储日志一般来说用ELK的概率比较高。
堆服务器,分库查询??
不够快就再加服务器,理论上0.1秒也是可以的。
这些答案想的太复杂了。你仔细算一下,ip地址是4个字节,也就是最多4G个。开一个16GB的数组,每个ip的4字节组成的32位数就是这个数组的索引,数组中每个元素32位整数,记录并自增这个索引对应的ip出现的次数。这样,你读一边10GB日志,也就算出最大的是谁了。找最大应该不用教对吧?
这样,如果磁盘够快,30秒以内就应该出数据了。
假设是n条记录,每个IP地址按点的分割,划分为四列。以第一部分为例,遍历一次(映射到一个连续的255个字节中),得出哪个数出现次数最多,对符合条件的第二列遍历,再选出第二列哪个数出现次数最多(对第一列出现最多的数量标记,可选,数量不多可以采用),依次类推。可以用多线程甚至多台计算机同时计算。
这个问题所用算法应该可以归结为经典的wordcount,不复杂,网上搜一下代码即可,不再赘述。
至于具体实现,有两种路线。第一是自己在网上开源代码基础上写一个专用程序,运行在大内存机器上,程序把数据全部加载到内存中,实现内存计算,为了加快速度,可以使用多线程。第二条路线是用支持内存计算的框架,比如spark,这样程序更简单,而且可以实现多机分布式并行检索,代价是需要学习不少东西。
elk日志系统几秒就得到你要的结果
华裔女赌王就此没落,生前让所有 浓情端午粽飘香,青浦邀你“云体 上海:“云端”展现端午节文化内 “甜咸大战”!明星艺人们喜欢什 如何做一个男人喜欢的情人(如何 当你和你同时出现在同一个场景中 如何在昏暗的光线下设置快门速度 教育在生活中的价值是什么? 世上做坏事的人死后会面临什么因 拜登就任总统后的第一步是什么? 同意/不同意:人生最重要的目标 二战后,德国在调和分歧方面做得 亚伯·林肯恨白人吗? 一个编辑能把你的故事毁得有多严 现在的iPhone6还能坚持再用一年 曹操为什么不杀司马懿? 现在买房是不是最便宜的时候,现 我身边的农业银行营业厅关了,AT 欧洲媒体评选CBA最有实力球员, 荣耀play的6+128和荣耀8X的6+128 蚂蚁集团是科技公司还是金融公司 请问机友华为mate30P与华为mate3 听说老詹修剪一次指甲需要5小时 为什么说宝宝“一月睡二月哭三月 戴笠人称戴老板,这个是怎么叫出 没有工作能一次性补缴社保么? 我想知道定向师范生和免费师范生 肺癌引起的咳嗽是怎样的呢? 5000mAh电池的5G手机推荐吗?要 恒大亚冠表现“差强人意”,你觉