当我试图用mapreduce实现PageRank时,我有一些问题。我想在这里引用代码https://stackoverflow.com/a/5029780/1117436来描述问题。
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)
在上面的过程中,很明显,map过程输入的第二个参数是url的Out链接,而reduce过程输出的第二个子参数似乎是url的In链接。那么,这些代码如何迭代工作呢?
那么我想问的是,如何编写代码来使页面排名正常工作?
更新:我认为这个答案解决了我的问题。https://stackoverflow.com/a/13568286/1117436
您可以使用MapReduce实现迭代算法,但这可能不是最好、更高效的方法(因为每次迭代都要将内容移动到HDFS/磁盘)。
话虽如此,如果你有兴趣研究如何使用MapReduce实现PageRank之类的东西,请看这里:
- https://github.com/castagna/mr-pagerank/
从PageRank.java中的run()方法开始
如果你感兴趣,你可以在这里看看一堆旧的(即2009年)幻灯片:
- https://github.com/castagna/mr-pagerank/blob/master/docs/pagerank-huguk-2009.pdf
现在,您可以在使用Pregel克隆(如Praveen已经向您建议的ApacheGiraph)实现/运行PageRank时获得更多乐趣。
已经有了几个图形处理框架。
看看ApacheGiraph,它可以用于图形处理。Giraph是以GoldenOrb先生为原型的。另外,看看ApacheHama,它是BSP的一个实现,它有自己的计算引擎,不是基于MR的,而是使用HDFS进行存储。Hama也可以用于图形处理。