PageRank 算法实现

article/2025/9/25 19:25:00

大数据管理与分析实验报告

实验一 大数据系统基本实验

实验二 文档倒排索引算法实现

实验三 PageRank 算法实现


实验目的

PageRank 网页排名的算法,曾是Google 发家致富的法宝。用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。通过对PageRank 的编程在Hadoop 和Spark 上的实现,熟练掌握MapReduce 程序与Spark 程序在集群上的提交与执行过程,加深对MapReduce 与Spark 的理解。

实验平台

  • 操作系统:Ubuntu Kylin
  • Hadoop 版本:2.10.1
  • JDK 版本:1.8
  • Java IDE:Eclipse 3.8

实验内容

在本地eclipse 上分别使用MapReduce 和Spark 实现PageRank 算法,Spark程序可采用Java、Python、Scala 等语言进行编程。数据集中每一行内容的格式:网页+\t+该网页链接到的网页的集合(相互之间用英文逗号分开)。例如,下图为其中一行的数据,因为一行显示不出来所以使用多行显示。
在这里插入图片描述
要求能够利用PageRank 算法的思想计算出每个网页的PR 值(迭代10 次即可),在伪分布式环境下完成程序的编写和测试。

实验要求

实验结果为连续迭代10 次后的输出结果
两个程序输出的结果格式均为(网页,PR 值),其中PR 值保留10 位小数,
部分结果如下所示:
在这里插入图片描述
标准输出存放在hdfs 上/output/PageRank 目录,使用diff 命令判断自己的输出结果与标准输出的差异

diff <(hdfs dfs -cat /output/FinalRank/part-r-00000) <(cat /home/hadoop/Desktop/part-r-00000)

实验思路

PageRank算法不再介绍。
代码中主要有3个类:GraphBuilder,PageRankIter,PageRankViewer,分别完成构建网页之间的超链接图,迭代计算各个网页的PageRank值,按PageRank值从大到小输出,通过PageRankDriver实现多趟MapReduce的处理。
代码中有一些注释说明,不算很难,按照课上和PPT思路完成即可。

实现代码

package org.apache.hadoop.examples;import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
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;public class exp3 {// 建立网页之间的超链接图public static class GraphBuilder {public static class GraphBuilderMapper extends Mapper<LongWritable, Text, Text, Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// map:逐行分析原始数据,输出<URL, (PR_init, link_list)>String pr = "1.0";  // PR值初始化为1.0String[] tmp = value.toString().split("\t");context.write(new Text(tmp[0]), new Text(pr + "\t" + tmp[1]));}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "GraphBuilder");job.setJarByClass(GraphBuilder.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);job.setMapperClass(GraphBuilderMapper.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));job.waitForCompletion(true);}}// 迭代计算各个网页的PageRank值public static class PageRankIter {private static final double d = 0.85;  // damping阻尼系数public static class PRIterMapper extends Mapper<LongWritable, Text, Text, Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String[] tmp = value.toString().split("\t");// tmp[0]:当前网页 tmp[1]:pr tmp[2]:指向网页String url = tmp[0];double cur_rank = Double.parseDouble(tmp[1]);if (tmp.length > 2) {String[] link_list = tmp[2].split(",");for (String linkPage : link_list) {context.write(new Text(linkPage), new Text(String.valueOf(cur_rank / link_list.length)));}}context.write(new Text(url), new Text("|" + tmp[2]));  // 做个标记"|"}}public static class PRIterReducer extends Reducer<Text, Text, Text, Text> {@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {double new_rank = 0;String url_list = "";for (Text value : values) {String tmp = value.toString();if (tmp.startsWith("|")) {  // 标志着链出信息url_list = tmp.substring(1);} else {new_rank += Double.parseDouble(tmp);}}new_rank = d * new_rank + (1 - d);  // 不是 (1-d)/Ncontext.write(key, new Text(String.valueOf(new_rank)+"\t"+url_list));}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "PageRankIter");job.setJarByClass(PageRankIter.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);job.setMapperClass(PRIterMapper.class);job.setReducerClass(PRIterReducer.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));job.waitForCompletion(true);}}// 将PageRank值从大到小输出public static class PageRankViewer {public static class PRViewerMapper extends Mapper<LongWritable, Text, DoubleWritable, Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String[] tmp = value.toString().split("\t");context.write(new DoubleWritable(Double.parseDouble(tmp[1])), new Text(tmp[0]));}}public static class DescDoubleComparator extends DoubleWritable.Comparator {public float compare(WritableComparator a, WritableComparable<DoubleWritable> b) {return -super.compare(a, b);}public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {return -super.compare(b1, s1, l1, b2, s2, l2);}}
//        public static class DecDoubleWritable extends DoubleWritable {
//            
//            @Override
//            public int compareTo(DoubleWritable o) {
//            	return -super.compareTo(o);
//            }
//        }public static class PRViewerReducer extends Reducer<DoubleWritable, Text, Text, Text> {@Overrideprotected void reduce(DoubleWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {for (Text value : values) {context.write(new Text("(" + value + "," + String.format("%.10f", key.get()) + ")"), null);}}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "PageRankViewer");job.setJarByClass(PageRankViewer.class);job.setOutputKeyClass(DoubleWritable.class);job.setOutputValueClass(Text.class);job.setMapperClass(PRViewerMapper.class);job.setSortComparatorClass(DescDoubleComparator.class);job.setReducerClass(PRViewerReducer.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));job.waitForCompletion(true);}}public static class PageRankDriver {private static int times = 10;public static void main(String[] args) throws Exception {String[] forGB = {"", args[1] + "/Data0"};  // GraphBuilderforGB[0] = args[0];GraphBuilder.main(forGB);String[] forItr = {"", ""};  // PageRankIterfor (int i = 0; i < times; i++) {forItr[0] = args[1] + "/Data" + i;forItr[1] = args[1] + "/Data" + (i + 1);PageRankIter.main(forItr);}String[] forRV = {args[1] + "/Data" + times, args[1] + "/FinalRank"};  // PageRankViewerPageRankViewer.main(forRV);}}// 主函数入口public static void main(String[] args) throws Exception {PageRankDriver.main(args);}
}

实验结果

在这里插入图片描述
在这里插入图片描述

反思总结

其实课上包括PPT已经讲了很多用MapReduce实现PageRank的算法介绍和具体细节,如果对于Java编程和Hadoop的API已经足够了解,那么根据这个思路和伪代码实现应该是不算难的,如果有问题,参考一些其他博客也能实现。
对我而言,更多接触的是C++和Python,Java编程菜鸟,顶多读懂,写这次实验还是需要不停地查一些资料,一些地方的报错不能理解,比如注释掉的DecDoubleWritable类,用它实现的代码不能得到最后的结果(理论上可以,但菜鸟不会调试Java),换成DescDoubleComparator再设置job.setSortComparatorClass(DescDoubleComparator.class)就能跑出结果。
Hadoop编写的代码,PageRank迭代时需要从文件读,再写到文件里,所以map和reduce的输入输出类型需要特别注意,最初写代码时就困惑于此,以为reduce的输出应该就是下一轮的输入了,但其实还要经过文件读写。
另外,Hadoop的API真的是一言难尽,官网上API的介绍也没有那么友好,写代码的时候我就没搞懂job.setOutputKeyClass和job.setOutputValueClass这两个常常用到的函数究竟是指谁的(具体可见这里)。


http://chatgpt.dhexx.cn/article/I3cjk1YK.shtml

相关文章

(简单介绍)PageRank算法

文章目录 前言引入形式化PageRank 前言 这个是一个经典算法&#xff0c;还是有必要了解的&#xff0c;这里由于讲得不会很详细&#xff0c;所以要求你有一点数学知识&#xff0c;如果有&#xff0c;看完这篇就大概明白PageRank是个啥了。本篇不涉及证明之类的&#xff0c;而是…

算法--PageRank

概念 PageRank是Google提出的算法&#xff0c;用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。是Google创始人拉里佩奇和谢尔盖布林于1997年创造的PageRank实现了将链接价值概念作为排名因素。 GOOGLE PageRank并不是唯一的链接相关的排名算法&#xff0c;而…

pagerank以及个性化的pagerank算法

pagerank以及个性化的pagerank算法 pagerank最开始是Google提出来用来衡量网页重要度排行的算法。 她的思想是基于网页之间互相的链接作为加权投票。假如网页a指向b&#xff0c; 那么网页b的重要程度受网页a的影响&#xff0c;a越重要&#xff0c;则b就越重要。假如网页c也指…

PageRank算法原理详解

&#xfeff;&#xfeff; 转自&#xff1a;http://blog.csdn.net/hguisu/article/details/7996185 1. PageRank算法概述 PageRank,即网页排名&#xff0c;又称网页级别、Google左侧排名或佩奇排名。 是Google创始人拉里佩奇和谢尔盖布林于1997年构建早期的搜索系统原型时提出…

PageRank算法改进

PageRank算法的应用 PageRank 算法是 Google 搜索引擎进行网页排名的一种算法&#xff0c;那么它如何映射到其他领域&#xff1f; 比如&#xff0c;我们如何在文献排名中应用PageRank算法呢&#xff1f; 对文献的质量进行排序是对文献价值进行评估的一种重要手段&#xff0c…

什么是Pagerank?Pagerank算法介绍与计算公式

一、什么是Pagerank&#xff1f; PageRank&#xff0c;网页排名&#xff0c;又称网页级别、Google左侧排名或佩奇排名&#xff0c;是一种由根据网页之间相互的超链接计算的技术&#xff0c;而作为网页排名的要素之一&#xff0c;而我们SEO简称为PR&#xff0c;以Google公司创办…

PageRank算法 -- 从原理到实现

本文整理自博文PageRank算法 – 从原理到实现 1. 算法来源 这个要从搜索引擎的发展讲起。最早的搜索引擎采用的是 分类目录1的方法,即通过人工进行网页分类并整理出高质量的网站。那时 Yahoo 和国内的 hao123 就是使用的这种方法。 后来网页越来越多,人工分类已经不现实了…

第4关: 网页排序——PageRank算法

要求&#xff1a;编写实现网页数据集PageRank算法的程序&#xff0c;对网页数据集进行处理得到网页权重排序。 ####相关知识 ######PageRank算法原理 1.基本思想&#xff1a; 如果网页T存在一个指向网页A的连接&#xff0c;则表明T的所有者认为A比较重要&#xff0c;从而把T的一…

PageRank算法--从原理到实现

本文将介绍PageRank算法的相关内容&#xff0c;具体如下&#xff1a; 算法来源算法原理算法证明PR值计算方法 1 幂迭代法2 特征值法3 代数法 算法实现 1 基于迭代法的简单实现2 MapReduce实现 PageRank算法的缺点写在最后参考资料 1. 算法来源 这个要从搜索引擎的发展讲起。最…

PageRank算法原理与实现

正文共835个字&#xff0c;8张图&#xff0c;预计阅读时间6分钟。 1、PageRank 1.1.简介 PageRank&#xff0c;又称网页排名、谷歌左侧排名&#xff0c;是一种由搜索引擎根据网页之间相互的超链接计算的技术&#xff0c;而作为网页排名的要素之一&#xff0c;以Google公司创办人…

PageRank算法原理及代码

本文内容出自帅器学习的课程内容&#xff0c;讲得原理清晰&#xff0c;概念深入&#xff0c;链接&#xff1a; PANKRANK算法视频 另有一篇知乎文章&#xff0c;PAGERANK讲得系统透彻&#xff0c;链接在此&#xff1a;关键词提取和摘要算法TextRank详解与实战 PAGERANK算法是一…

PageRank算法 -- 图算法

一、简述&#xff1a; PageRank算法是一个迭代求解算法&#xff0c;可以处理网页排名&#xff08;根据网页的重要性进行排序&#xff09;、社会影响力分析、文本摘要 等问题。 PageRank算法在1996年由Page和Brin提出 PageRank适用于解决用有向图表示的图数据 二、各节点重要性…

PageRank算法

一、算法原理&#xff1a; 1、如果一个网页被很多其他网页链接到的话说明这个网页比较重要&#xff0c;也就是PageRank值会相对较高 2、如果一个PageRank值很高的网页链接到一个其他的网页&#xff0c;那么被链接到的网页PageRank值也会相应提高。 例子&#xff1a; 如果一…

pagerank算法详解

目录 一、pagerank简介两个重要假设 二、pagerank算法公式定义计算演示矩阵化计算 三、存在的两个问题问题1.Dead Ends问题2.Spider Traps 一、pagerank简介 PageRank算法的基本想法是在有向图上定义一个随机游走模型&#xff0c;即一阶马尔可夫链&#xff0c;描述随机游走者沿…

整车CAN网络拓扑图

什么是智能硬件与ECU ? 何为智能硬件, 就是包含智能控制单元的硬件, 比如发动机, 发动机上有一块儿专门负责控制发动机进气量, 喷油量, 排气量的控制单元, 这块单元相当于发动机的大脑. 他具有信号发送, 信号接收, 参数存储等基本功能, 这个控制单元就是ECU. ECU(Electronic …

如何利用CANoe在两路CAN通道之间创建网关(gateway)

1 目的 利用CANoe在两路CAN通道之间创建一个网关&#xff0c;通过CAPL实现CAN1、CAN2通道间的报文转发&#xff0c;并进行故障注入测试&#xff08;通过改变某些信号的值&#xff09;。 &#xff08;本实例仅用于博主学习记录&#xff09; 2 步骤 创建一个两路通道&#xf…

CANoe-如何模拟CAN总线网关通信(满满都是细节)

网络上有不少的文章介绍使用canoe工具模拟网关把can1总线上的报文转发到can2上,那我为什么要写这篇文章呢?大家知道,我的文章不可能完全照搬别人的内容,肯定要夹带私货,有自己的理解的。所以我会从网关在can总线中的工作方式到所起的作用进行分析,学习如何在canoe中实现模…

CAN/CANopen转PROFINET网关TCO-151

型号&#xff1a;TCO-151 基本说明&#xff1a;TCO-151可实现 PROFINET网络与CANopen或CAN网络之间的数据通信。网关在PROFINET网络作为从站&#xff0c;CANopen端既可以做主站也可以做从站&#xff0c;CAN端支持CAN2.0A/CAN2.0B协议&#xff0c;支持对CAN帧进行过滤处理。 特…

CAN总线网关设备

南京来可电子科有限公司 CAN总线网关设备

嘴哥有料系列-can教程2:CAN网关及CAN信号转发机制

原文章&#xff1a;https://mp.weixin.qq.com/s/qbUcZngSDClx9Ll5aKvlLg 上节课, 我们讲到了CAN网关, 其实准确的说不能叫CAN网关, 应该叫网关或者汽车网关, 因为网关不仅处理CAN网络, 还处理LIN网络. 主要是为了配合本系列教程及区分于以太网网关, 所以才取名叫CAN网关. CAN…