PageRank是用于解决网页重要性排序的关键技术之一,其基于网页之间链接关系构建一个有向图结构,实现各个网页级别的划分。一个网页的PageRank值(后面简称PR值),取决于其他网页对该网页的贡献和,以公式形式表示为,其中U表示所有网页指向网页b的网页集合,L(a)表示网页a的出度,d表示用户浏览一个网页的随机概率,用于解决网页关系间的陷阱问题。根据公式递归计算,各网页的PR值将最终趋于稳定。可以发现,该算法的执行实质是一个概率矩阵的迭代乘法运算。
1. 实验准备
由于Hadoop与Spark对于PageRank算法的实现过程不同,这里分别对Hadoop与Spark算法输入文件进行说明。
对于Hadoop输入文件,每行的数据信息包含网页ID、网页初始PR值1.0以及该网页链接的其他网页ID,以制表符隔开,如
A 1 B,C
B 1 C
C 1 A,D
D 1 B,E
E 1 A
对于Spark输入文件,以网页ID以及该网页链接的每一个网页ID,作为单独一行保存,如
A B
A C
B C
C A
C D
D B
D E
E A
2. Hadoop实现
为了完成后续的迭代计算,map过程需要将链接关系图和对其他网页的贡献值分别传递给reduce端。
reduce过程根据key将最终计算的PR值与链接关系图合并输出,用于下次迭代的map端。
测试以10次为收敛标准迭代进行,具体代码实现如下:
package org.hadoop.test;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class PageRank {
private static final double d =