使用MapReduce实施PageRank

问题描述 投票:11回答:4

[我正在尝试解决通过MapReduce实现PageRank的理论问题。

我有以下简单的场景,带有三个节点:A B C。

邻接矩阵在这里:

A { B, C }
B { A }

例如,B的PageRank等于:

(1-d)/N + d ( PR(A) / C(A) ) 

N     = number of incoming links to B
PR(A) = PageRank of incoming link A
C(A)  = number of outgoing links from page A

我对所有原理图以及映射器和化简器的工作方式都很好,但是我无法确定在化简器计算时如何知道C(A)。当通过聚合到B的传入链接来计算B的PageRank时,reducer将如何知道每个页面的传出链接数。这是否需要在某些外部数据源中进行查找?

algorithm mapreduce pagerank
4个回答
18
投票

这里是一个伪代码:

map( key: [url, pagerank], value: outlink_list )
    for each outlink in outlink_list
        emit( key: outlink, value: pagerank/size(outlink_list) )

    emit( key: url, value: outlink_list )

reducer( key: url, value: list_pr_or_urls )
    outlink_list = []
    pagerank = 0

    for each pr_or_urls in list_pr_or_urls
        if is_list( pr_or_urls )
            outlink_list = pr_or_urls
        else
            pagerank += pr_or_urls

    pagerank = 1 - DAMPING_FACTOR + ( DAMPING_FACTOR * pagerank )

    emit( key: [url, pagerank], value: outlink_list )

重要的是,在reduce中,应输出外链而不是内链,如有关常识的一些文章所建议的那样。这样,连续的迭代也将有出站作为映射器的输入。

请注意,来自同一页面的具有相同地址的多个出站计数为一个。另外,不要计算循环(页面链接到自身)。

传统上,阻尼因子为0.85,尽管您也可以使用其他值。


4
投票

[A detailed explanation with Python code,由Michael Nielsen。]


1
投票

我们反复评估PR。 PR(x)= Sum(PR(a)* weight(a),in_links中的a)通过

map ((url,PR), out_links) //PR = random at start
for link in out_links
   emit(link, ((PR/size(out_links)), url))

reduce(url, List[(weight, url)):
   PR =0
   for v in weights
       PR = PR + v
   Set urls = all urls from list

   emit((url, PR), urls)

所以输出等于输入,我们可以这样做直到覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.