其实这个内容和原来的文章是放在一起的,但之前只看了Online版,后来才看的batch版。发现其实batch版本更有意思且更适用。
online版可以看我博客里的翻译:
http://blog.csdn.net/lgnlgn/archive/2010/11/14/6008498.aspx
简单介绍一下simhash和mapreduce吧
simhash用来近似计算文本之间的相似度实际上就是考察两个fingerprint的汉明距离,汉明距离小于阈值的就认为相似文本。
那么在海量文本中近似查重问题就是海量指纹中如何快速确定是否存在汉明距离小于阈值的指纹。
online版的算法做了空间与时间的折中,将指纹集复制多份,对待查的指纹在每份集合中 查找出一部分指纹精确相同的一批指纹,然后对这一批指纹挨个检查汉明距离。复制得越多,挨个检查的需要就越小。每份指纹集的查询采用并行的方式提高效率。
mapreduce是一个分布式计算框架,目前网上的介绍也很多了,用最简单的方式可以描述成:
map: (K1,V1) ➞ list(K2,V2)
reduce: (K2,list(V2)) ➞ list(K3,V3)
在batch版本中,需要对一批指纹M(比如100万)在80亿个指纹S中进行检查,
100W个指纹约为8MB,80亿个指纹有64G,
海量的指纹集在分布式文件系统中会被切开成很多份(一般每份64M)
mapper中,将M排序,并复制多份,对S进行遍历,每条指纹按online版的方式进行查重, 如果找到了,就返回M中对应哪条指纹
reduce的时候把这些重复的指纹收集起来就行了
由于M并不大 在分布式系统中分发并不会造成网络瓶颈,而且M不大 因此可以在内存中复制多份。
整个mapreduce的过程非常简单~这个算法也算是学习mapreduce的一个好例子了~
另外simhash这篇论文涉及了查找、压缩、空间时间折中,是一篇非常值得细读的文章。