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();
			}
		}
	}
}

  

时间: 2024-12-16 08:15:42

mr实现pagerank的相关文章

谈谈PageRank

闲来无事,整理一下算法.今天整理一下PageRank. 网上搜了搜感觉这篇文章还不错 http://www.cnblogs.com/fengfenggirl/p/pagerank-introduction.html 本文对这篇文章进行修改加工,加入了一些自己的思想,后面代码实现用了Spark而不是原文的MR. PageRank作用是给出网页的重要性,它的思想是这样的: 根据"民主投票"来确定的重要性,越重要的话语权越大,不断的投票获得新的重要值,直到收敛.(能力有限就不推导证明收敛了)

Google”在垃圾中寻找黄金“——Page-Rank

GOOGLE"在垃圾中寻找黄金"--Page Rank GOOGLE"在垃圾中寻找黄金"--Page Rank 1.Google的低成本之道 ○不使用超级计算机,不使用存储(淘宝的去i,去e,去o之路) ○大量使用普通的PC服务器(去掉机箱,外设,硬盘),提供有冗余的集群服务 ○全世界多个数据中心,有些附带发电厂 ○运营商向Google倒付费 2.Google面对的数据和计算难题 大量的网页如何存储? Google的爬虫每天在全世界各个服务器里面爬到的很多网页,这些

MR基本的运作流程

MapReduce的核心是:分而治之,并行处理:以及其调度和处理数据的自动化. MR中主要是Map和Reduce两个阶段,其中基本流程是: 1.mr的数据处理单位是一个split,一个split对应一个map任务,处理时会有多个map任务同时运行:当map从HDFS上读取一个split时,这里会有"移动计算,不移动数据"的机制来减少网络的数据传输,使得效率能最大化: 2.获取到split时,默认会以TextInputFormat的格式读入,文件中的字符位置的偏移量作为 key,以及每一

pagerank算法

转自 http://blog.csdn.net/hguisu/article/details/7996185 1. PageRank算法概述 PageRank,即网页排名,又称网页级别.Google左侧排名或佩奇排名. 是Google创始人拉里·佩奇和谢尔盖·布林于1997年构建早期的搜索系统原型时提出的链接分析算法,自从Google在商业上获得空前的成功后,该算法也成为其他搜索引擎和学术界十分关注的计算模型.目前很多重要的链接分析算法都是在PageRank算法基础上衍生出来的.PageRank

VR、AR、MR的区别

VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的虚拟世界,提供使用者关于视觉.听觉.触觉等感官的模拟,让使用者如同身历其境一般,可以及时.没有限制地观察三度空间内的事物. 什么是增强现实? 增强现实(Augmented Reality,简称AR),也被称之为混合现实.它通过电脑技术,将虚拟的信息应用到真实世界,真实的环境和虚拟的物体实时地叠加到了

PageRank

另一篇介绍的很好deblog:http://blog.jobbole.com/71431/ 一.什么是PageRank PageRank 是对搜索引擎的搜索网页进行排序的算法. 过去的排序算法是比如使用网页名字,关键词出现的次数,人工等方法,但是这种方法一方面搜索结果不准确,另一方面搜索结果容易被人为因素影响. 所以,PageRank应运而生. PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重要性进行排序.它的思想是模拟一个悠闲的上网者,上网者首先随机选择一

HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)

Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 312    Accepted Submission(s): 219 Problem Description One day, you, a clever boy, feel bored in your math class, and then fall

Eclipse调用hadoop2运行MR程序(转)

hadoop:hadoop2.2 ,windows myeclipse环境: Eclipse调用hadoop运行MR程序其实就是普通的java程序可以提交MR任务到集群执行而已.在Hadoop1中,只需指定jt(jobtracker)和fs(namenode)即可,一般如下: [java] view plaincopy Configuration conf = new Configuration(); conf.set("mapred.job.tracker", "192.1

【转】深入浅出PageRank算法

原文链接 http://segmentfault.com/a/1190000000711128 PageRank算法 PageRank算法是谷歌曾经独步天下的“倚天剑”,该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的, 论文点击下载: The PageRank Citation Ranking: Bringing Order to the Web. 本文首先通过一些参考文献引出问题,然后给出了PageRank的几种实现算法, 最后将其推广至在MapReduce框架下