mr实现pagerank
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的更多相关文章
- MR PAGERANK思路
map( key: [url, pagerank], value: outlink_list ) for each outlink in outlink_list emit( key: outlink ...
- using MR to compute PageRank
In this post I explain how to compute PageRank using the MapReduce approach to parallelization. This ...
- 【Hadoop学习之十一】MapReduce案例分析三-PageRank
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...
- VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?
整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...
- 【十大经典数据挖掘算法】PageRank
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...
- VR、AR、MR的区别
VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...
- PageRank的java实现
一个网络(有向带权图)中节点u的PageRank的计算公式: PR(u)表示节点u的PageRank值,d为衰减因子(damping factor)或阻尼系数,一般取d=0.85,N为网络中的节点总数 ...
- MR操作
MR操作————Map.Partitioner.Shuffle.Combiners.Reduce 1.Map步骤 1.1 读取输入文件,解析成k-v对,其中每个k-v对调用一次map函数 1.2 写自 ...
- 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码
在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...
随机推荐
- Jacey:烧了500万才知道,信息流广告OCPC竟然要这样玩!心疼
现在很多线索类广告主,已经不满足于表单.在线咨询等获客方式,随着微商的火热,很多行业都玩起了个人微信号加粉的方式来获取潜在消费者. 随着手机的普遍,移动流量呈大幅上涨趋势,越来越多广告主将目光投向了信 ...
- Rsync备份功能总结
备份服务笔记====================================================================== Rsync是一款开源的.快速的.多功能的.可实 ...
- QT项目添加现有文件后不能运行,MFC在类视图中自动隐藏类
解决方案:1)QT 5.6版本的QtCreator打开pro文件,在最后加一行空行或者删除一行空行,保存即可: 2)在隐藏的类对应的头文件中增加一行或删除一行(空格也可以),即可自动出现.
- 什么是P2P流标
1.被动流标:在规定的投标时间内,一般是7天,没有凑齐这笔借款,就流标了: 2.主动流标:借款人或平台原因,将为投满的标下架,做流标处理 介绍: 对于投资者来说,在投资P2P理财的时候,可能会遇到过流 ...
- ActiveMq Windows 配置优化
最近ActiveMQ 5.15.3 会报 OutofMemory的错误 在 wrapper.conf中 #wrapper.java.additional.8=-Dorg.apache.activemq ...
- <Dare To Dream> 第四次作业:基于原型的团队项目需求调研与分析
任务1:实施团队项目软件用户调研活动. (1)真实的用户调研对象:生科院大三学生 (2)利用实验七所开发的软件原型:网站原型链接 (3)要有除原型法之外的其他需求获取手段: 访谈法 开会研讨法 (4) ...
- jquery中的 deferred之 then (二)
例: var def = $.Deferred(); var prs1 = def.then(function (val) { var result = val + "_123" ...
- Linux 日常用法
1.ubuntu 中安装vim http://jingyan.baidu.com/article/046a7b3efd165bf9c27fa915.html 2.linux 系统中安装SSH http ...
- python入门(十三):面向对象(继承、重写、公有、私有)
1. 三种类定义的写法 class P1:#定义类 加不加()都可以 pass class P2(): #带(),且括号中为空,类定义 pass ...
- Python设计模式 - UML - 对象图(Object Diagram)
简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...