如果你现在需要计算网页的排名只有4一:数据如下面的:

baidu	10.00 google,sina,nefu
google 10.00 baidu
sina 10.00 google
nefu 10.00 sina,google

1. baidu  存在三个外链接

2.google 存在1个外链接

3.sina 存在1个外链接

4.nefu. 存在2个外链接

由数据能够看出:全部链接都指向了google,所以google的PR应该最高。而由google指向的baidu的PR值 应该也非常高。

代码例如以下:

package PageRank;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner; public class PageRank {
/**
* @author XD
*/
static enum PageCount{
Count,TotalPR
}
public static class Map extends Mapper < LongWritable , Text , Text , Text >{
protected void map(LongWritable key, Text value , Context context) throws IOException, InterruptedException{
context.getCounter(PageCount.Count).increment(1);
String[] kv = value.toString().split("\t");
String _key = kv[0];
String _value = kv[1];
String _PRnLink[] = _value.split(" ");
String pr = _PRnLink[0];
String link = _PRnLink[1];
context.write(new Text(_key),new Text(link));
String[] site = link.split(",");
float score = Float.valueOf(pr)/(site.length)*1.0f;
for(int i=0;i<site.length;i++){
context.write(new Text(site[i]), new Text(String.valueOf(score)));
}
}
}
public static class Reduce extends Reducer < Text , Text , Text, Text>{
protected void reduce(Text key , Iterable<Text> values ,Context context) throws IOException, InterruptedException{
StringBuilder sb = new StringBuilder();
float factor = 0.85f; //阻尼因子
float pr = 0f;
for(Text val : values){
String value = val.toString();
int s = value.indexOf(".");
if(s != -1){
pr += Float.valueOf(value);
}else{
String site[] = value.split(",");
int _len = site.length;
for(int k=0;k<_len;k++){
sb.append(site[k]);
sb.append(",");
}
}
}
pr = ((1-factor)+(factor*(pr)));
context.getCounter(PageCount.TotalPR).increment((int)(pr*1000));
String output = pr+" "+sb.toString();
context.write(key, new Text(output));
}
}
public static void main(String[] args) throws IOException, URISyntaxException, ClassNotFoundException, InterruptedException {
// TODO Auto-generated method stub
String input,output;
int threshold = 100;
int iteration = 0;
int iterationLimit = 10; boolean status = false; while(iteration < iterationLimit){
//展开重复迭代 注意 输入输出的路径
if((iteration % 2) == 0){
input = "hdfs://localhost:9000/output_pr/p*";
output = "hdfs://localhost:9000/output_pr2";
}else{
input = "hdfs://localhost:9000/output_pr2/p*";
output = "hdfs://localhost:9000/output_pr";
}
Configuration conf = new Configuration();
final FileSystem filesystem = FileSystem.get(new URI(input),conf);
final Path outPath = new Path(output);
if(filesystem.exists(outPath)){
filesystem.delete(outPath, true);
}
Job job = new Job(conf,PageRank.class.getSimpleName()); //1.1 读取文件 位置
FileInputFormat.setInputPaths(job, input); //1.2指定的map类//1.3 map输出的key value 类型 要是和终于的输出类型是一样的 能够省略
job.setMapperClass(Map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setJarByClass(PageRank.class); //1.3 分区
job.setPartitionerClass(HashPartitioner.class); job.setReducerClass(Reduce.class);
//指定 reduce的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); //指定写出到什么位置
FileOutputFormat.setOutputPath(job, new Path(output));
status = job.waitForCompletion(true);
iteration++;
long count = job.getCounters().findCounter(PageCount.Count).getValue();
long TotalPr = job.getCounters().findCounter(PageCount.TotalPR).getValue();
System.out.println("PageCount:"+count);
System.out.println("TotalPR:"+TotalPr);
double per_pr = TotalPr/(count*1.0d);
System.out.println("PEr_er:"+per_pr);
if((int)per_pr == threshold){
System.out.println("Iteration:"+iteration);
break;
}
}
System.exit(status? 0:1);
}
}

最后输出结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGRfMTIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

PageRank算法MapReduce实现的更多相关文章

  1. PageRank算法简介及Map-Reduce实现

    PageRank对网页排名的算法,曾是Google发家致富的法宝.以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理. 一.什么是pagerank Pag ...

  2. Hadoop实战训练————MapReduce实现PageRank算法

    经过一段时间的学习,对于Hadoop有了一些了解,于是决定用MapReduce实现PageRank算法,以下简称PR 先简单介绍一下PR算法(摘自百度百科:https://baike.baidu.co ...

  3. MapReduce实现PageRank算法(邻接矩阵法)

    前言 之前写过稀疏图的实现方法,这次写用矩阵存储数据的算法实现,只要会矩阵相乘的话,实现这个就很简单了.如果有不懂的可以先看一下下面两篇随笔. MapReduce实现PageRank算法(稀疏图法) ...

  4. MapReduce实现PageRank算法(稀疏图法)

    前言 本文用Python编写代码,并通过hadoop streaming框架运行. 算法思想 下图是一个网络: 考虑转移矩阵是一个很多的稀疏矩阵,我们可以用稀疏矩阵的形式表示,我们把web图中的每一个 ...

  5. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  6. PageRank算法--从原理到实现

    本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...

  7. PageRank算法实现

    基本原理 在互联网上,如果一个网页被很多其他网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高.这就是PageRank的核心思想. 引用来自<数学之美>的简单例子: 网页Y的排名应该 ...

  8. PageRank算法和谷歌搜索讲解

    PageRank算法和谷歌搜索讲解 吴裕雄 PageRank算法实际上就是Google使用它来计算每个网页价值的算法. Google每次的搜索结果都有成百上千万甚至上亿个相关的查询网页链接.如果将所有 ...

  9. PageRank 算法简介

    有两篇文章一篇讲解(下面copy)< PageRank算法简介及Map-Reduce实现>来源:http://www.cnblogs.com/fengfenggirl/p/pagerank ...

随机推荐

  1. [置顶] dubbo管理控制台安装

    dubbo管理控制台开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能. 1.下载dubbo 地址:http://code.alibabatech.com/mvn ...

  2. 关于Thread类中三个interrupt方法的研究与学习(转)

    先看三个方法原型: public void interrupt(): public boolean isInterrupted(): public static boolean interrupted ...

  3. [置顶] android开发之来电自动拒接并自动回复短信_上课模式app

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去. 当然了,需要权限的. 尝试做了个雏形出来. 界面如下: 主要代码如下: pac ...

  4. qt qml中PropertyAnimation的几种使用方法

    qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移 ...

  5. 为Delphi程序增加UAC功能(每个步骤都很详细)

    相关资料:http://bbs.csdn.net/topics/320071356# 操作方法: 在Source\VCL目录下应该有这样两个文件sample.manifest和WindowsXP.rc ...

  6. div仿checkbox表单样式美化及功能

    div仿checkbox表单样式美化及功能(checkbox的样式不好看)素材在底部: 效果图: window.css .bj { position: absolute; top: 0; left: ...

  7. hdoj 1258 SUM IT UP

    程序的思想是:输入数据是,先使用快排对其从大到小进行排序,然后记录相同数据的个数,比如4 3 3 2 2 1 1,最后的数据变成4 3 2 1 ,并且同时数据的个数f[]变成1 2 2 2 然后就是遍 ...

  8. 灰度共生矩阵(GLCM) 及matlab代码实现

    原地址:http://blog.csdn.net/bookwormno1/article/details/7962466 这几天学习灰度共生矩阵,现记录如下: 讲灰度共生矩阵比较好的一份百度文库文档: ...

  9. matlab矩阵的表示和简单操作

    原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必 ...

  10. VSTO之旅系列(三):自定义Excel UI

    原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创 ...