使用MapReduce实现Pagerank算法

Pagerank算法的介绍可以参考 Wikipedia。网络上很多关于Pagerank的原理介绍,但关于该算法的具体实现的资料却很缺乏。这两天我花了一些时间仔细琢磨了这个算法的具体实现。其中一种方法是基于内存实现的,前提是链接的节点ID都能够载入内存(可以用签名或者编号代替链接),那么链接关系对数据可以从外部文件顺序读入,即可在内存完成一轮计算,并通过反复遍历链接关系对文件,进行迭代,直到收敛。但这种方法需要很大的内存,且在搜索引擎的海量链接中,这种方法会有很大的局限性。很自然,我们会想通过Mapreduce这种方式来实现大规模数据的并行计算。而这方面资料比较少,我简单整理并思考了一下使用Mapreduce实现Pagerank算法的基本方法,记录如下,与大家分享,欢迎大家指正。

网页数据的预处理部分略过不提,假设我们已经得到了链接对,并且给前链赋上PR初值(规模较小时,初值0.5效果已经不错)。对于迭代过程的Map/Reduce可以用伪码(Pseudo)表示如下:

Mapper函数的伪码:

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

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

PageK -> <PageN1, RankN1/Nn1>
PageK -> <PageN2, RankN2/Nn2>
...
PageK -> <PageAk, PageBk, PageCk>

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 <PageK, RankK> -> <PageAk, PageBk, PageCk...>
end

至此,Map/Reduce函数就完成,我们只需要不断迭代,直接其收敛就可以。收敛函数简单的判定方法可以选择前后两次计算的PR值的误差绝对值之和小于一定阈值。

上面这个Map/Reduce是最基本的方法,具体实践中还有很大的优化空间。关于优化算法留待具体工作中再做考虑。

 

转载自:http://hi.baidu.com/internetview/blog/item/579ebf00204f06da267fb531.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值