【问题标题】:Implementing PageRank using MapReduce使用 MapReduce 实现 PageRank
【发布时间】:2011-02-17 13:03:56
【问题描述】:

我正在努力解决使用 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


【解决方案1】:

这是一个伪代码:

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 )

正如 intenret 上的一些文章所建议的那样,在 reduce 中您应该输出外链接而不是内链接,这一点很重要。这样,连续迭代也将外链作为映射器的输入。

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

阻尼系数通常为 0.85,但您也可以使用其他值。

【讨论】:

    【解决方案2】:

    我们反复评估 PR。 PR(x) = Sum(PR(a)*weight(a), a in_links) by

    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)
    

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

    【讨论】:

    • 这里描述的算法有缺陷。 Webgraph 是一个有向图,所以初始 PageRanks 只去一个方向(到外链)。在您的减速器中,您将链接输出到页面并在下一次迭代中使用它。这使得 PR “回流”。请注意,初始算法还使用阻尼因子进行计算,这对于正确建模“随机浏览”非常重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多