人文艺术 > 海量数据算法:如何从超过10G的记录IP地址的日志中,较快的找出登

海量数据算法:如何从超过10G的记录IP地址的日志中,较快的找出登

2020-08-10 14:25阅读(75)

海量数据算法:如何从超过10G的记录IP地址的日志中,较快的找出登录次数最多的一个IP?这种海量数据中找出出现次数最多的一项,这类问题如何解现在网上的答案通常

1

采样随机位置从样本里取出10块数据,每块数据1k,数据块之间不重合。

然后统计一下这10块数据中哪个IP地址出现的次数最多即可。

2

10g的日志,应该是文本类型的。10g的文本文件遍历一遍基本上必须的。逐行读取,正则匹配出IP地址转行成数字类型,变成数组,读取每一行都判断数组中是否存在,如果有计数器加一,如果没有新建一个。虽然有一些算法可以减少遍历,比如在遍历到超过一半之后,如果发现有IP超过了总数的一半儿,后面就不需要遍历了,比如剩余30%之后,所有跟第一名差距超过30%的可以都不计数了,但是这种情况基本在最后才会遇见,判断的时间超过计数器的时间。性价比最好的就是遍历一般计数器来实现。

3

网上的答案需要十几分钟是什么答案?能阐述一下吗?

存储日志一般来说用ELK的概率比较高。

4

堆服务器,分库查询??

不够快就再加服务器,理论上0.1秒也是可以的。

5

这些答案想的太复杂了。你仔细算一下,ip地址是4个字节,也就是最多4G个。开一个16GB的数组,每个ip的4字节组成的32位数就是这个数组的索引,数组中每个元素32位整数,记录并自增这个索引对应的ip出现的次数。这样,你读一边10GB日志,也就算出最大的是谁了。找最大应该不用教对吧?

这样,如果磁盘够快,30秒以内就应该出数据了。

6

假设是n条记录,每个IP地址按点的分割,划分为四列。以第一部分为例,遍历一次(映射到一个连续的255个字节中),得出哪个数出现次数最多,对符合条件的第二列遍历,再选出第二列哪个数出现次数最多(对第一列出现最多的数量标记,可选,数量不多可以采用),依次类推。可以用多线程甚至多台计算机同时计算。

7

这个问题所用算法应该可以归结为经典的wordcount,不复杂,网上搜一下代码即可,不再赘述。

至于具体实现,有两种路线。第一是自己在网上开源代码基础上写一个专用程序,运行在大内存机器上,程序把数据全部加载到内存中,实现内存计算,为了加快速度,可以使用多线程。第二条路线是用支持内存计算的框架,比如spark,这样程序更简单,而且可以实现多机分布式并行检索,代价是需要学习不少东西。

8

elk日志系统几秒就得到你要的结果