PageRank的MapReduce实现

如何用 Hadoop 的 MapReduce 思想来计算 PageRank 呢?其实理解起来还是很简单的。PageRank的计算公式如下:

Rv=alpha * Sigma(Rn/Nn)+ (1-apha)/N

Mapper 的输入格式为:
(节点,PageRank 值)->(该节点的外部链接节点列表)

Mapper 的输出格式为:
(节点) -> (该节点的反向链接节点,反向节点的 PankRank 值/反向节点的外链个数)

Reducer 的输入格式(Mapper 的计算输出)为:
(节点) -> (该节点的反向链接节点,反向节点的 PankRank 值/反向节点的外链个数)

Reducer 的输出为:
(节点, 新的 PageRank 值)
假设有物理节点 A,B 参与计算,其中网页1、2保存于 A,网页3、4保存于 B,各个网页的 PageRank 初始值是1.0,alpha 值取 0.85,那么运算过程如下:

节点 A 上做 Mapper:
输入为:
(1,1.0)-> (2,3,4)
(2,1.0)-> (3,4)

输出为:
(2)-> (1,1.0/3)
(3)-> (1,1.0/3)
(4)-> (1,1.0/3)
(3)-> (2,1.0/2)
(4)-> (2,1.0/2)

节点 B 上做 Mapper:
输入为:
(3,1.0)-> (4)
(4,1.0)-> (2)

输出为:
(4)-> (3,1.0)
(2)-> (4,1.0)

Reducer:
输入为 节点 A 和 B 的输出。
计算新的 PageRank 结果如下:
(1): 0 + (1-0.85)/4
(2): 0.85*(1.0/3+1.0)+ (1-0.85)/4
(3): 0.85*(1.0/3+1.0/2)+ (1-0.85)/4
(4): 0.85*(1.0/3+1.0/2+1.0)+ (1-0.85)/4

多次迭代得出稳定的 PageRank 值。
伪代码:

Mapper函数的伪码:

input  -> PageA, PageB, PageC ... // 链接关系
begin
    Nn := the number of outlinks for PageN;
    for each outlink PageK
        output PageK -> 
    // 同时输出链接关系,用于迭代
    output PageN -> PageA, PageB, PageC ...
end

Mapper的输出如下(已经排序,所以PageK的数据排在一起,最后一列则是链接关系对):

PageK -> 
PageK -> 
...
PageK -> 

Reduce函数的伪码:

input mapper's output
begin
    RankK := 0;
    for each inlink PageNi
        RankK += RankNi/Nni * beta
    // output the PageK and its new Rank for the next iteration
    output  -> 
end

你可能感兴趣的:(Hadoop)