大数据管理技术实习二——PageRank
实验目的
本实验为Map Reduce小组作业实习一项目,目的为给定风筝网络图为输入时实现PageRank算法,算出该图的值分布。
编程思路
参考:https://blog.csdn.net/u010414589/article/details/51404971
-
输入与输出:
将给定网络图转化为文档,其中格式为:
node_name_i pagerank_i i_link_1 i_link_2 …
在该表达方式中,每一行中第一列为网页i,第二列为该网页的pagerank 值(最初始每个网页的值都是均等的,都为1/n,在该网络中为0.1),之后的列均为网页i 链接的网页。 因为我们要迭代的计算PageRank值,那么每次MapReduce 的输出要和输入的格式是一样的,这样才能使得Mapreduce 的输出用来作为下一轮MapReduce 的输入。
-
Map设计过程
-
对每行文本进行分析,获得当前网页及其PageRank值(在network.jpg图中初始为0.1),以及当前网页要链接到的其他网页
-
计算出要连接到其他网页的个数,求出当前网页对于其他网页的贡献
pr=pagerank/count(float类型)
-
在考虑map()的输出时,需要有两种输出,一种<key,value>为<其他网页,贡献值>;一种为<当前网页,要链接的所有其他网页>
-
为区别两种输出,可以在第一种输出的value中加@,第二种的value中加&。
-
这两种输出经shuffle后合并为一种,<key, value1,value2>,其中value1为本次迭代得到的来自其他网页的贡献值,value2为他的链接网页
-
-
Reduce设计过程
·Reduce的key直接作为输出的key,而对于value做如下处理:
·如果开头为@则表示应为得到的贡献,将key相同的此类value加和
· 如果开头为&则仍然保持不变,作为该网页的链接网页
· 最后得到的输出为<key,value1’,value2>,其中value1是本次迭代结束后该网页的PageRank值,而这个输出将作为下一次map的输入。
-
Main函数设计过程
在main函数中给出了输入输出路径,通过循环来设定了总的迭代次数(一般为30~40次)。且每次迭代完毕后下次的输入路径更新为本次输出路径,输出路径更新。
实验步骤
-
创建java类PageRank,写入代码
-
导出为可运行jar包
-
新建输入路径,并将文件传入hdfs:
hdfs dfs -mkdir /pagerank hdfs dfs -mkdir /pagerank/input hdfs dfs -put ./Downloads/homework/adj.txt /pagerank/input
(每次运行完都需要确认/output删除,才能顺利下次运行)
-
执行jar文件:hadoop jar PageRank.jar
可以看到最后一步确实有结果写入。
-
取回本地查看
hdfs dfs -get /pagerank/output/part-r-00000 ./ cat part-r-00000
注意事项
注意迭代次数大于1时存储的顺序:第一次产生直接在output中,之后的次数分别存在1/12/123/…文件夹中,最终结果存在最长名字的文件夹中而不是最外层