分治法+Hash处理海量日志数据

海量日志数据,提取出某日访问百度次数最多的那个IP。
   首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

算法思想:分而治之+Hash
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

如果不是这样,那么如果直接分成1024个文件,就可能会出现某一个IP在每一个子文件中都存在,但不是每一个文件中出现次数最多的,这样是否有可能造成结果不准确

时间: 2024-08-15 15:04:42

分治法+Hash处理海量日志数据的相关文章

海量日志数据如何处理统计?

项目需要做一个dashboard图表网站,展示日志的相关统计信息.这个页面图表很多,一次性会加载出很多数据. 日志表有很多种,都是一些入侵攻击日志.恶意站点访问日志等等,需要统计出当前时间.过去24小时.过去一周被攻击主机个数.恶意站点数(这是其中两个需求)等等数据. 比如被攻击主机个数,需要查多张数据表,然后统计出这个数据. 日志存储在PostgreSQL里面,已经基于时间做了分表,但是每天的的日志量都在100W以上. 写入数据库的模式是随时从其他的系统中写入. 根据这个应用场景,如果设计这个

海量日志数据__怎么在海量数据中找出重复次数最多的一个

问题一:         怎么在海量数据中找出重复次数最多的一个 算法思想:         方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数. 然后找出上一步求出的数据中重复次数最多的一个就是所求(如下). 问题二: 网站日志中记录了用户的IP,找出访问次数最多的IP. 算法思想:       IP地址最多有2^32=4G种取值可能,所以不能完全加载到内存中. 可以考虑分而治之的策略: map 按照IP地址的hash(IP)%1024值,将海量日志

面对海量的数据,我们应该如何处理?

一.海量数据处理 所谓海量数据处理,无非就是基于海量数据上的存储.处理.操作.何谓海量,就 是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导 致无法一次性装入内存. 那解决办法呢? 针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit- map/堆/trie树. 针对空间,无非就一个办法:大而化小,分而治之(hash映射). 相关内容后续GitHub更新(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https

海量日志分析与智能运维

以下文字版根据<大咖·来了>第3期<海量日志分析与智能运维>整理,回放链接:http://aix.51cto.com/activity/10011.html?dk=wz 一.AIOps 与智能日志中心 1.1AIOps 五等级 要说智能日志中心,首先要了解什么是智能运维.目前业界对智能运维的运用,主要分为如下五个等级. 一级是最容易的,只要你有个想法试试就行,到网管监控系统里,拿一个监控指标的曲线下来,就可以尝试异常检测. 一级还没有成熟的单点应用,当有了一个成熟的单点应用,就算是

MongoDB应用案例:使用 MongoDB 存储日志数据

线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖掘出有价值的内容,则需要对数据进行进一步的存储和分析. 本文以存储 web 服务的访问日志为例,介绍如何使用 MongoDB 来存储.分析日志数据,让日志数据发挥最大的价值,本文的内容同样使用其他的日志存储型应用. 模式设计 一个典型的web服务器的访问日志类似如下,包含访问来源.用户.访问的资源地

实时海量日志分析系统的架构设计、实现以及思考

1 序 对ETL系统中数据转换和存储操作的相关日志进行记录以及实时分析有助于我们更好的观察和监控ETL系统的相关指标(如单位时间某些操作的处理时间),发现系统中出现的缺陷和性能瓶颈. 由于需要对日志进行实时分析,所以Storm是我们想到的首个框架.Storm是一个分布式实时计算系统,它可以很好的处理流式数据.利用storm我们几乎可以直接实现一个日志分析系统,但是将日志分析系统进行模块化设计可以收到更好的效果.模块化的设计至少有两方面的优点: 模块化设计可以使功能更加清晰.整个日志分析系统可以分

分表后 快速查询所有数据

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义. 假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份: [sql] view plain copy CREATE TABLE log_YY ( dt  DATETIME

分治法

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子问题的解可以合并为该问题的解: 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题. 分治法的基本步骤:分治法在

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函