PageRank计算
什么是pagerank
PageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。
是Google创始人拉里·佩奇和谢尔盖·布林于1997年创造的
PageRank实现了将链接价值概念作为排名因素。

PageRank计算
算法原理(1)
入链 ====投票
PageRank让链接来“投票“,到一个页面的超链接相当于对该页投一票。
入链数量
如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。
入链质量
指向页面A的入链质量不同,质量高的页面会通过链接向其他页面传递更多的权重。所以越是质量高的页面指向页面A,则页面A越重要。
PageRank计算
网络上各个页面的链接图

算法原理(2)
初始值
每个页面设置相同的PR值
Google的pagerank算法给每个页面的PR初始值为1。
迭代递归计算(收敛)
Google不断的重复计算每个页面的PageRank。那么经过不断的重复计算,这些页面的PR值会趋向于稳定,也就是收敛的状态。
在具体企业应用中怎么样确定收敛标准?
1、每个页面的PR值和上一次计算的PR相等
2、设定一个差值指标(0.0001)。当所有页面和上一次计算的PR差值平均小于该标准时,则收敛。
3、设定一个百分比(99%),当99%的页面和上一次计算的PR相等

算法原理(3)
修正PageRank计算公式
由于存在一些出链为0,也就是那些不链接任何其他网页的网, 也称为孤立网页,使得很多网页能被访问到。因此需要对 PageRank公式进行修正,即在简单公式的基础上增加了阻尼系数(damping factor)q, q一般取值q=0.85。

完整PageRank计算公式

package com.laoxiao.mr.pagerank;

import java.io.IOException;
import java.util.Arrays; import org.apache.commons.lang.StringUtils; public class Node { private double pageRank=1.0;
private String[] adjacentNodeNames; public static final char fieldSeparator = '\t'; public double getPageRank() {
return pageRank;
} public Node setPageRank(double pageRank) {
this.pageRank = pageRank;
return this;
} public String[] getAdjacentNodeNames() {
return adjacentNodeNames;
} public Node setAdjacentNodeNames(String[] adjacentNodeNames) {
this.adjacentNodeNames = adjacentNodeNames;
return this;
} public boolean containsAdjacentNodes() {
return adjacentNodeNames != null && adjacentNodeNames.length>0;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(pageRank); if (getAdjacentNodeNames() != null) {
sb.append(fieldSeparator).append(StringUtils.join(getAdjacentNodeNames(), fieldSeparator));
}
return sb.toString();
} //value =1.0 B D
public static Node fromMR(String value) throws IOException {
String[] parts = StringUtils.splitPreserveAllTokens(value, fieldSeparator);
if (parts.length < 1) {
throw new IOException(
"Expected 1 or more parts but received " + parts.length);
}
Node node = new Node()
.setPageRank(Double.valueOf(parts[0]));
if (parts.length > 1) {
node.setAdjacentNodeNames(Arrays.copyOfRange(parts, 1,
parts.length));
}
return node;
}
} package com.laoxiao.mr.pagerank; public enum Mycounter {
my
} package com.laoxiao.mr.pagerank; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class pagerankMapper extends Mapper<Text, Text, Text, Text>{ protected void map(Text key, Text value, Context context)
throws java.io.IOException ,InterruptedException { int runCount= context.getConfiguration().getInt("runCount", 1);
String page=key.toString();
Node node=null;
if(runCount==1){
node=Node.fromMR("1.0\t"+value.toString());
}else{
node=Node.fromMR(value.toString());
} Double pagerank=node.getPageRank()/node.getAdjacentNodeNames().length;
context.write(new Text(page), new Text(node.toString()));//A:1.0 B D
if(node.containsAdjacentNodes()){
double outValue =node.getPageRank()/node.getAdjacentNodeNames().length;
for (int i = 0; i < node.getAdjacentNodeNames().length; i++) {
String outPage = node.getAdjacentNodeNames()[i];
context.write(new Text(outPage), new Text(outValue+""));//B:0.5 D:0.5
}
}
};
} package com.laoxiao.mr.pagerank; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class pagerankReducer extends Reducer<Text, Text, Text,Text>{ protected void reduce(Text arg0, java.lang.Iterable<Text> arg1, Context arg2)
throws java.io.IOException ,InterruptedException {
double sum =0.0;
Node sourceNode =null;
for(Text i:arg1){
Node node =Node.fromMR(i.toString());
if(node.containsAdjacentNodes()){
sourceNode =node;
}else{
sum=sum+node.getPageRank();
}
} double newPR=(0.15/4)+(0.85*sum);
System.out.println("*********** new pageRank value is "+newPR);
//把新的pr值和计算之前的pr比较
double d= newPR -sourceNode.getPageRank(); int j=(int)( d*1000.0);
j=Math.abs(j);
//累加器的使用
arg2.getCounter(Mycounter.my).increment(j); sourceNode.setPageRank(newPR);
arg2.write(arg0, new Text(sourceNode.toString())); };
} package com.laoxiao.mr.pagerank; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class RunJob { public static void main(String[] args) {
int i=0;
Configuration config=new Configuration();
config.set("fs.defaultFS", "hdfs://node1:8020");
config.set("yarn.resourcemanager.hostname", "node1"); double d =0.001;
while(true){
i++;
try {
config.setInt("runCount", i);//传值到mr中
FileSystem fs =FileSystem.get(config);
Job job =Job.getInstance(config);
job.setJarByClass(RunJob.class);
job.setJobName("pr"+i);
job.setMapperClass(pagerankMapper.class);
job.setReducerClass(pagerankReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setInputFormatClass(KeyValueTextInputFormat.class);
Path inputPath =new Path("/root/input/data/pagerank.txt");
if(i>1){
inputPath =new Path("/usr/output/pr"+(i-1));
}
FileInputFormat.addInputPath(job, inputPath); Path outpath =new Path("/usr/output/pr"+i);
if(fs.exists(outpath)){
fs.delete(outpath, true);
}
FileOutputFormat.setOutputPath(job, outpath); boolean f= job.waitForCompletion(true);
if(f){
System.out.println("success.");
//累加器的使用
long sum= job.getCounters().findCounter(Mycounter.my).getValue();
System.out.println(sum);
double avgd= sum/4000.0;
if(avgd<d){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

  

mr实现pagerank的更多相关文章

  1. MR PAGERANK思路

    map( key: [url, pagerank], value: outlink_list ) for each outlink in outlink_list emit( key: outlink ...

  2. using MR to compute PageRank

    In this post I explain how to compute PageRank using the MapReduce approach to parallelization. This ...

  3. 【Hadoop学习之十一】MapReduce案例分析三-PageRank

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...

  4. VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?

    整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...

  5. 【十大经典数据挖掘算法】PageRank

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...

  6. VR、AR、MR的区别

    VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...

  7. PageRank的java实现

    一个网络(有向带权图)中节点u的PageRank的计算公式: PR(u)表示节点u的PageRank值,d为衰减因子(damping factor)或阻尼系数,一般取d=0.85,N为网络中的节点总数 ...

  8. MR操作

    MR操作————Map.Partitioner.Shuffle.Combiners.Reduce 1.Map步骤 1.1 读取输入文件,解析成k-v对,其中每个k-v对调用一次map函数 1.2 写自 ...

  9. 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码

    在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...

随机推荐

  1. 五、Python-字典与集合

    字典是一系列键-值对,每个键都与一个值想关联,可以用键来访问与之关联的值,与键相关联的值可以是数字.字符串.列表乃至字典(Python可以将任何对象作为字典中的值),Python中,字典用“{}”表示 ...

  2. 如何使用cloudflare的CDN加速网站隐藏网站IP

    原文:http://www.safecdn.cn/contact-zh/2018/12/cloudflare-cdn/1146.html 高防CDN:https://www.safeidc.cn/cd ...

  3. 字符型转换为字符串ToString

    字符型转换为字符串 // C 货币 2.5.ToString("C"); // ¥2.50 // D 10进制数 25.ToString("D5"); // 2 ...

  4. 线程之Callable、Future 和FutureTask使用及源码分析

    一.Callable 我们知道启动线程有以下两种方式(jdk源码注释中官方定义只有两种启动方式,callable不算线程启动方式) 原文链接:http://www.studyshare.cn/blog ...

  5. 关于background-size 的一点小坑

    目前在做一个网页,要求使用一个图片作为背景,必须要全屏目填充,于是我想,这不是很简单的事情么: 有两种实现方法:首先设置添加一个div(或者body),把div(或者body)元素的宽和高都设置成10 ...

  6. Idea安装lombok插件【转载】

    参照:http://www.cnblogs.com/holten/p/5729226.html https://yq.aliyun.com/articles/59972 lombok是一个可以通过简单 ...

  7. React16的interactiveUpdates

    交互式更新是用户交互的结果. 它们比默认的非交互式更新(如服务器事件)具有更高的优先级. 异步模式下交互式更新的特殊之处在于,一次交互式更新可能会影响后续行为. 例如,一个表单字段上的"提交 ...

  8. nginx优化php-fpm优化 压力测试达到每分150万访问量webbench网站压力

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  9. MySQL多实例的环境下,服务器端本地连接到指定实例的问题(sock方式连接)

    涉及到sock连接的问题. 为了测试MySQL的某些个特性,在一个机器上安装了多个MySQL的实例,如下截图,有两个实例,一个端口是8000,一个端口是8001.在使用mysql -uroot -p ...

  10. hbuilder 打包 vueAPP

    1:设置状态栏颜色 在manifest.json 找到 plus 下添加 "statusbar": { "immersed": true/*沉浸式状态栏*/ 设 ...