8、PageRank

Page-rank源于Google,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。
Page-rank实现了将链接价值概念作为排名因素。

算法原理

– 入链 == 投票
• Page-rank  让链接来“ 投票 “ ,到一个页面的超链接相当于对该页投一票。

– 入链数量
• 如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要。

– 入链质量
• 指向页面A的入链质量不同,质量高的页面会通过链接向其他页面传递更多的权重。所以越是质量高的页面指向页面A ,则页面
A 越重要。

– 初始值
• 每个页面设置相同的PR值
• Google的page-rank算法给每个页面的PR初始值为1。

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

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

– 完整Page-rank计算公式

import java.io.IOException;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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
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 PageRankRun {public static enum MyCounter{counter}public static class PRMapper extends Mapper<Text, Text, Text, Text>{//webname:weight    linkout1 linkout2 linkoutn//webname weight:linkout1 linkout2 linkoutn//linkout1 weight//linkout2    weight//linkoutn    weight@Overrideprotected void map(Text key, Text value, Context context)throws IOException, InterruptedException {String[] links = value.toString().split(" ");int num = links.length;String[] pageRank = key.toString().split(":");context.write(new Text(pageRank[0]), new Text(pageRank[1] + ":" + value.toString()));double weight = Double.parseDouble(pageRank[1].trim());for(String s : links)context.write(new Text(s), new Text(weight/num + ""));}}public static class PRReducer extends Reducer<Text, Text, Text, Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {String links = "";double oldPR = 0;int totalWebNum = context.getConfiguration().getInt("totalWebNum", 1);double newPR = (1-0.85)/totalWebNum;for(Text t : values){String[] s = t.toString().trim().split(":");if (s.length > 1){links = s[1].trim();oldPR = Double.parseDouble(s[0]);}else{newPR += Double.parseDouble(s[0])*0.85;}}int i = (int)Math.abs((oldPR - newPR)*10000);context.getCounter(MyCounter.counter).increment(i);context.write(new Text(key.toString() + ":" + newPR), new Text(links));}}public static void main(String[] args) throws Exception{Configuration conf = new Configuration();conf.setInt("totalWebNum", 4);boolean flag = true;double limit = 0.0001;while(true){Job job = Job.getInstance(conf);job.setJarByClass(PageRankRun.class);job.setInputFormatClass(KeyValueTextInputFormat.class);job.setMapperClass(PRMapper.class);job.setReducerClass(PRReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);Path in;Path out;if (flag){in = new Path("/home/jinzhao/mrtest/input");out = new Path("/home/jinzhao/mrtest/output");flag = false;}else{out = new Path("/home/jinzhao/mrtest/input");in = new Path("/home/jinzhao/mrtest/output");flag = true;}FileInputFormat.setInputPaths(job, in);FileSystem fs = FileSystem.get(conf);if (fs.exists(out))fs.delete(out, true);FileOutputFormat.setOutputPath(job,  out);if (job.waitForCompletion(true)){long sum= job.getCounters().findCounter(MyCounter.counter).getValue();double avgd= sum*1.0/(conf.getInt("totalWebNum", 1)*10000);if(avgd < limit){fs.delete(in, true);break;}}}}
}

05 MapReduce应用案例03相关推荐

  1. 05 MapReduce应用案例02

    6.統計每個月份中,最高的三個溫度. 輸入格式:年月日 空格 時分秒 TAB 溫度 inputfile: 1949-10-01 14:21:02    34c 1949-10-02 14:01:02  ...

  2. 05 MapReduce应用案例01

    1.单词计数 在一定程度上反映了MapReduce设计的初衷--对日志文件进行分析. public class WordCountMapper extends Mapper<LongWritab ...

  3. hadoop之mapreduce教程+案例学习(二)

    第3章 MapReduce框架原理 目录 第3章 MapReduce框架原理 3.1 InputFormat数据输入 3.1.1 切片与MapTask并行度决定机制 3.1.2 Job提交流程源码和切 ...

  4. 大数据 - MapReduce编程案例 -BH3

    MapReduce编程案例 用mapreduce解决问题的关键是确定key,只有key相同的结果才会到同一个reduce中进行处理 默认分区使用HashPartitoner,hashCode%redu ...

  5. MapReduce经典案例总结

    MapReduce经典案例总结 首先得搭好hadoop环境,windows搭好单机环境 1.根据手机号统计上网流量,统计上行流量.下行流量和总流量 数据如下,文件 flow.log,上传到hadoop ...

  6. hadoop之mapreduce教程+案例学习(一)

    第1章 MapReduce概述 目录 第1章 MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发"基于Hadoop的数据分析 ...

  7. Tableau可视化设计案例-03基本表、树形图、气泡图、词云

    文章目录 Tableau可视化设计案例 03基本表.树形图.气泡图.词云 1.基本表 1.1基本表的使用 1.2凸显表的使用 1.3二值凸显表 2.树形图 2.1不同类型酒店数量与评价人数 2.2油尖 ...

  8. 【赵强老师】MapReduce编程案例之求工资总额

    先看视频. [赵强老师]MapReduce编程案例之求工资总额 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上, ...

  9. MapReducer——MapReduce编程案例:求部门的工资总额(2)

    MapReduce编程案例:求部门的工资总额 1.员工表  SQL:select deptno,sum(sal) from emp group by deptno; 2.分析数据处理的过程 3.开发程 ...

最新文章

  1. 个人开发者帐号+wireless install 实现非app store程序的在线更新功能
  2. Google怎么用linux
  3. c++学习笔记(3)
  4. Dubbo入门(一)
  5. Xsens MTi -1 姿态传感器恢复与MTI的通信的方法
  6. 自动生成web服务器日志解析规则
  7. 开源推荐:.Net Core3.1 + EF Core + LayUI 封装的MVC版后台管理系统
  8. MySql、Oracle、MSSQL中的字符串的拼接
  9. system verilog语法
  10. Windows问题记录之任务栏图标透明
  11. 广州首发跨境电商“全球卖”-成都扬帆牧哲跨境电商
  12. 编译器报错The type of the expression must be an array type but it resolved to int.
  13. RTSP安防网络摄像头/海康大华硬盘录像机/NVR网页无插件低延时播放流媒体服务器EasyNVR页面显示网络请求失败问题
  14. 00 后程序员就要为“你”加班?呵呵
  15. 激光雷达学习——二维激光雷达数据转PC2
  16. qfn封装怎么焊接_qfn封装焊接教程
  17. 软件测试与维护实验报告,软件测试技术与实践实验报告
  18. Python输出斐波那契数列【递归、迭代】
  19. Linux ndk编译 报错 bits/c++configure.h is not found
  20. mysql 连接没有释放

热门文章

  1. Mysql的undo、redo、bin log分析
  2. 【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)
  3. Java SimpleTimeZone setEndRule()方法与示例
  4. 黑色背景下,计算照片白色的区域面积和周长
  5. java ssm如何上传图片_ssm整合-图片上传功能(转)
  6. mysql 笔记05 select语句以及条件语句的使用
  7. Linux系统【一】CPU+MMU+fork函数创建进程
  8. 实验3 | 由遍历序列构造二叉树
  9. SQL实现当前行等于前面两行数据之和
  10. Linux网络配置:设置IP地址、网关DNS、主机名