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

       今看一博客:Python处理海量数据的实战研究.使用python从海量数据中进行数据搜索.链接为:http://blog.csdn.net/quicktest/article/details/7453189

       具体处理业务为从百度海量日志数据中提取,某日访问访问百度次数最多的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散列将对象散列到不同的存储节点上等等...

 

 

 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值