在每个节点上计算 URL 的出现次数。然后使用分片功能将 url 分发到另一个拥有 URL 密钥的节点。现在每个节点都有唯一的键。然后在每个节点上再次减少以获取 URL 的出现次数,然后找到前 N 个 URL。最后只发送前 N 个 url 到主节点,主节点将在 K*N 项中找到前 N 个 URls,其中 K 是节点数。
Eg: K=3
N1 - > url1,url2,url3,url1,url2
N2 - > url2,url4,url1,url5,url2
N3 - > url1,url4,url3,url1,url3
第 1 步:计算每个节点中每个 url 的出现次数。
N1 -> (url1,2),(url2,2),(url3,1)
N2 -> (url4,1),(url2,2),(url5,1),(url1,1)
N3 -> (url1,2),(url3,2),(url4,1)
第二步:分片使用哈希函数(为简单起见,设为url数%K)
N1 -> (url1,2),(url1,1),(url1,2),(url4,1),(url4,1)
N2 -> (url2,2),(url2,2),(url5,1)
N3 -> (url3,2),(url3,1)
步骤4:再次查找节点内每个键的出现次数。
N1 -> (url1,5),(url4,2)
N2 -> (url2,4),(url5,1)
N3 -> (url3,3)
第 5 步:仅将前 N 个发送给 master。令 N=1
Master -> (url1,5),(url2,4),(url3,3)
对结果进行排序并获得前 1 项,即 url1
第 1 步称为 map 侧缩减,这样做是为了避免在第 2 步中发生巨大的 shuffle。