您的位置:首页 > 其它

从海量数据处理方法看hash散列的重要性

2012-04-18 23:18 260 查看
今看一博客:Python处理海量数据的实战研究.使用python从海量数据中进行数据搜索.链接为:/article/11023002.html

具体处理业务为从百度海量日志数据中提取,某日访问访问百度次数最多的IP。

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

首先将1亿个ip地址,按照发生器分到多个具体文件中去,然后分别统计每个文件访问次数最高的ip地址,最终再压缩,将N个文件选出来的访问次数第一的ip地址再来一次压缩排序,得到最终结果.

作者思路类似MapReduce的方式,分而治之的进行维数压缩。但是该问题有一个问题,由于Ip可能重复,因此如果有个ip,分别在每个文件统计时,都处于第2名,所以最终就会落选,但是总次数确实最多的。如同作者在文章结束所提到的情况一样。最后作者给出一种方法,即:不划分文件一次加载进行排序,那这样就不能满足小内存计算需要了。

为什么该方法会有这样的问题,其实问题本质在于,IP通过文件划分导致的。因为这样完全顺序划分,会把相同ip划分到不同的文件中去.在这样的基础上,某个IP可能会在多个文件中,而单个文件中每个IP的访问次数可能不是最高的,但是总次数却是最高的。比如IP :A,在文件1中访问次数为1000,但是文件1中IP B问1001次,文件2中A访问次数1000次,IP B 0次,IP C 1001次,这样两个文件的第一名分别为IP B,IP C,那IP B虽说是总数第一,但是失去了最后统计的资格.

怎么改进呢?使用hash散列来将这一亿个IP进行散列分解到1000个桶中,由于散列函数求解,对于相同IP求解出的散列值一样,那肯定就分到了相同的桶中,这样一来,在对各个桶中求最高访问频率,最终合在一起求访问频率就是准确的...

hash散列在处理海量数据确实有强大的魔力,比如在分布式文件系统swift中使用hash散列将对象散列到不同的存储节点上等等...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: