pagerank是如何以分布式方式计算的



我理解pagerank背后的想法,并已经实现了它(在阅读《编程集体智能》一书时)。

但我读到它可以分布在多个服务器上(我想谷歌正在这么做)。我有点困惑,因为根据我的理解,你需要整个图表才能在上面进行页面排名,因为每个排名都是相对于其他排名的。

我找到了维基上的文章,但它没有解释太多。

关于这是怎么可能的,有什么建议吗?此外,还有一个额外的问题:做分布式pagerank的技术是pagerank独有的,还是所使用的方法可以应用于其他应用于图的机器学习算法?

计算PageRank的最先进方法是使用Google Pregel框架。我很确定他们现在有更复杂的东西,但这是最新发表的成果。

你可以在研究博客中阅读更多关于它的详细信息。或者在这里阅读已发表的论文。

我正在开发一个名为ApacheHama的批量同步并行范例的开源版本。还有ApacheGiraph,它只关注图形用例和许多其他用例。

与mfrankli提到的一样,还有MapReduce框架(例如Apache Hadoop)可以用于计算PageRank,但对于迭代算法来说效率不高。

值得注意的是,这两个解决方案(MapReduce和BSP)都是批处理解决方案,因此它们可以用于重新计算完整网络图的PageRank。由于谷歌的更新速度比批处理算法快得多,你可以预期他们会经常在子图上重新计算PageRank。

| 0 0 0 1 0 |
| 0 0 0 1 0 |
| 0 0 0 1 1 |
| 1 1 1 0 0 |
| 0 0 1 0 0 |

是邻接矩阵(或图)。则PageRank中的转移矩阵M将是

| 0 0   0 1/3 0 |
| 0 0   0 1/3 0 |
| 0 0   0 1/3 1 |
| 1 1 1/2   0 0 |
| 0 0 1/2   0 0 |

它是列随机的、不可约的和非周期的。

MapReduce从这里开始。映射器的串行输入将类似

1 -> 4
2 -> 4
3 -> 4 , 5
4 -> 1 , 2 , 3
5 -> 3

并且映射器将发出以下内容:

< 1 , [4] >
< 4 , 1 >
< 2 , [4] >
< 4 , 1 >
< 3 , [4 , 5] >
< 4 , 1/2 >
< 5 , 1/2 >
< 4 , [1, 2, 3] >
< 1 , 1/3 >
< 2 , 1/3 >
< 3 , 1/3 >
< 5 , [3] >
< 3 , 1 >

映射器输出将按关键字分组,并按减速器获取。如果我们有5个减速器,它会像:

R1 takes [4]       , 1/3           then computes 1/5*(1/3)           =  2/30
R2 takes [4]       , 1/3           then computes 1/5*(1/3)           =  2/30
R3 takes [4, 5]    , 1/3 , 1       then computes 1/5*(1/3 + 1)       =  8/30
R4 takes [1, 2, 3] ,   1 , 1 , 1/2 then computes 1/5*(  1 + 1 + 1/2) = 15/30
R5 takes [3]       , 1/2           then computes 1/5*(1/2)           =  3/30

现在,第一次(幂)迭代已经结束。在以下减少作业中,减少器将像映射器一样发射,但是,将使用计算的PR而不是1:

< 1 , [4] >
< 4 , 2/30 >
< 2 , [4] >
< 4 , 2/30 >
< 3 , [4 , 5] >
< 4 , 4/30 >
< 5 , 4/30 >
< 4 , [1, 2, 3] >
< 1 , 5/30 >
< 2 , 5/30 >
< 3 , 5/30 >
< 5 , [3] >
< 3 , 3/30 >

重复reduce作业,直到它足够收敛或您满意为止。

MapReduce提供了一些有趣的背景,可能会澄清如何并行化此任务。

最新更新