hadoop上的pageRank算法
简单的pageRank实现参考:http://wlh0706-163-com.iteye.com/blog/1397694
较为复杂的PR值计算以及在hadoop上的实现:http://deathspeeder.is-programmer.com/posts/31349.html
pageRank算法的基本思想是:网页的热门程度依赖指向它的网页的热门程度。
也许google当初的PageRank网页排名有着很严密的数学逻辑推导,但在编程的时候实现这种数学推导困难很大,用的更多的是另外一个超级简单的数学公式,同样可以实现将网页排名的目的。
PageRank原理分析
举例来讲:
假设每个网页都有一个自己的默认PR值,相当于人为添加给它是一种属性,用来标识网页的等级或者重要性,从而依据此标识达到排名目的。假设有ID号是1的一个网页,PR值是10,假如它产生了到ID=3,ID=6,ID=8 ,ID=9这4个网页的链接。那么可以理解为ID=1的网页向ID=3,6,8,9的4个网页各贡献了2.5的PR值。如果想求任意一个网页假设其ID=3的PR值,需要得到所有的其他网页对ID=3这个网页的贡献的总和,再按照函数“所求PR”=“总和”*0.85+0.15得到。经过循环多次上述过程求得的网页PR值,可以作为网页排名的标识。
MapReduce过程分析
1:准备数据
理论数据是通过网页爬虫得到了某个特定封闭系统的所有网页的信息,为了测试程序,可以自己模拟生成自己定义特定格式的数据。下面是我用来测试的数据,存储方式如图
(注:对于自定义模拟数据,在PR初始值的选取时,所有的网页是“平等”的,不会说自己写的网页和Google的热门网页有多少差别,但是按照某种法则经过一定运算后PR是不一样的,比如很多其他的网页可能会链接到google,它的PR自然会比你的高。所以初始值的选取按照这种逻辑来讲符合现实些,即所有网页默认PR值相等。但是即使初始值定的不一样,整个系统的PR总和可能会变化,最后的每个网页PR也会发生变化,但是这种量之间的变化,不会影响到网页自身的通过比较大小方式上的逻辑排名。
2:Map过程
map接受的数据格式默认是<偏移量,文本行>这样的<key,value>对,形如<0,1 5 2 3 4 5><20,2 10 3 5 8 9>.
目标 :将默认数据格式,转换成自定义格式<key,value>对。
已知 :hadoop框架在Map阶段的时候会自动实现sort过程,就是将相同的key的所有value保存到list,形如<key,list(1,1,1,2)>这种形式,例如上述对ID=2的网页有ID=1,6,7,8.这4个网页贡献(1.25,1,5/3,5),那么如果你采用的key是网页ID,那么hadoop框架会以此种形式<2,list(1.25,1,5/3,5)>输出。
分析 :因为这个过程要进行多次,reduce的最终输出结果需要保存成原文件那样的格式,所以每个网页ID和自己链接情况也要在map阶段输出给reduce。
操作 :所以对于上述第一行操作map函数后结果是<id=1,2><id=1,3><id=1,4>,<id=1,5>保存了id=1网页的链接情况,同时还要输出<id=2,1.25><id=3,1.25><id=4,1.25><id=5,1.25>,每个网页得到的贡献值。
代码:
public static class MyMapper extendsMapper<Object, Text, IntWritable, Text> {//存储网页IDprivate IntWritable id;//存储网页PR值private String pr;//存储网页向外链接总数目private int count;//网页向每个外部链接的平均贡献值private float average_pr;public void map(Object key, Text value, Context context) {StringTokenizer str = new StringTokenizer(value.toString());if (str.hasMoreTokens()) {// 得到网页IDid = new IntWritable(Integer.parseInt(str.nextToken()));} else {return;}// 得到网页prpr = str.nextToken();// 得到向外链接数目count = str.countTokens();// 对每个外部链接平均贡献值average_pr = Float.parseFloat(pr) / count;// 得到网页的向外链接ID并输出while (str.hasMoreTokens()) {try {String nextId = str.nextToken();//将网页向外链接的ID以“@+得到贡献值”格式输出Text t = new Text("@" + average_pr);context.write(id, t);// 将网页ID和PR值输出Text tt = new Text("&" + nextId);context.write(id, tt);} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}
Reduce阶段:
分析:这个阶段操作就相对简单很多,读取map的输出<key,value>,并解析出来。
具体操作:如果value中首字母是“@”表示是贡献值,如果是“&”表示是链接情况。
public void reduce(IntWritable key, Iterable<Text> values,Context context) {// 定义一个存储网页链接ID的队列ArrayList<String> ids = new ArrayList<String>();// 将所有的链接ID以String格式保存String lianjie = " ";// 定义一个保存网页PR值的变量float pr = 0;//遍历for(Text id : values) {String idd = id.toString();//判断value是贡献值还是向外部的链接if (idd.substring(0, 1).equals("@")) {// 贡献值pr += Float.parseFloat(idd.substring(1));} else if (idd.substring(0, 1).equals("&")) {// 链接idString iddd = idd.substring(1);System.out.println("idddd= " + iddd);ids.add(iddd);}}// 计算最终prpr = pr * 0.85f + 0.15f;// 得到所有链接ID的String形式for (int i = 0; i < ids.size(); i++) {lianjie += ids.get(i) + " ";}// 组合pr+lianjie成原文件的格式类型String result = pr + lianjie;System.out.println("Reduce result=" + result);try {context.write(key, new Text(result));System.out.println("reduce 执行完毕。。。。。");} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}
main函数:
public static void main(String[] args) throws IOException,InterruptedException, ClassNotFoundException {Configuration conf = new Configuration();String pathIn1 = "/usr/local/hadoop/tt/ww";//输入路径String pathOut=“”;//输出路径//迭代10次for (int i = 0; i < 10; i++) {System.out.println("xunhuan cishu=" + i);Job job = new Job(conf, "MapReduce pagerank");pathOut = pathIn1 + i;job.setJarByClass(Main2.class);job.setMapperClass(MyMapper.class);job.setReducerClass(MyReducer.class);job.setOutputKeyClass(IntWritable.class);job.setOutputValueClass(Text.class);FileInputFormat.addInputPath(job, new Path(pathIn1));FileOutputFormat.setOutputPath(job, new Path(pathOut));pathIn1 = pathOut;job.waitForCompletion(true);}}
转载于:https://www.cnblogs.com/dandingyy/archive/2013/03/08/2950740.html
hadoop上的pageRank算法相关推荐
- 【10】基于大数据hadoop框架实现PageRank算法
文章目录 一.PageRank算法的简介 二.算法原理 1.基本原理 2.互联网角度 3.修正PageRank计算公式:增加阻尼系数 4.基于大数据原生hodoop来思考这个算法 实例 三.Java代 ...
- pagerank算法c语言,在hadoop的map-reduce框架下实现经典的pagerank算法
编程环境: Ubuntu16.4 uklin Hadoop3.2.0 openjdk version "1.8.0_191" spark 2.3.0 ( 集群环境 ) 完整代码已经 ...
- 朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现
1. Naïve Bayes算法介绍 Naïve Bayes是一个简单有效的分类算法,已经得到广泛使用.本文讨论了海量数据(TB级)下Naïve Bayes算法的实现方法,并给出了Hadoop上的实现 ...
- 在Hadoop上运行基于RMM中文分词算法的MapReduce程序
原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...
- PageRank算法--从原理到实现
本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...
- PageRank算法并行实现
算法为王系列文章,涵盖了计算机算法,数据挖掘(机器学习)算法,统计算法,金融算法等的多种跨学科算法组合.在大数据时代的背景下,算法已经成为了金字塔顶的明星.一个好的算法可以创造一个伟大帝国,就像Goo ...
- PageRank算法简介及Map-Reduce实现
PageRank对网页排名的算法,曾是Google发家致富的法宝.以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理. 一.什么是pagerank Pag ...
- 在微博中应用PageRank算法
这个想法很早就有了,因为我是做搜索引擎背景的,能够深刻的理解PageRank算法在搜索引擎中的重要性,绝对的核心技术之一.不过,这篇博客,并不打算介绍PageRank算法的原理,而是,让我们来看看,这 ...
- 【MapReduce】使用MapReduce实现PageRank算法
使用MapReduce实现PageRank算法 PageRank算法的介绍 PageRank是什么? 方法原理 算法过程 算法公式 算法的缺点 简单模型 代码的实现流程 数据信息 第一计数类 自定义类 ...
最新文章
- 最牛X的GCC 内联汇编
- R语言构建xgboost模型:使用xgboost构建泊松回归(poisson regression)模型
- HDU 2896 病毒侵袭 AC自动机
- Python jsonpath库的使用:解析json并将结果保存到文件
- apereo cas开发_Apereo CAS Server服务端搭建教程
- sqlyog同步mysql_大坑:用SQLyog连mysql的部分操作不能同步到从库
- WinForm CefSharp 笔记一(入门篇)
- Could not load requested class
- 计算机《画图》教案学生状态,《初识“画图”》教案设计.doc
- python爬取网页数据软件,有哪些不错的爬虫软件是可以免费爬取网页数据的?
- 浅析计算机用户身份识别技术,浅谈网络安全之身份认证技术
- Web安全学习系列(1)
- 语音聊天源码开发之常用动画效果的实现
- 非阻塞recvfrom卡住
- 挑选西瓜(决策树实现)
- 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?
- 地理信息科学专业转计算机,2019地理信息科学专业就业前景和就业方向分析
- php案例:$_SERVER详解(图文并茂)
- CelebA数据集下载|HTTPSConnectionPool(host=‘drive.google.com‘, port=443)|RuntimeError:Dataset not found
- 店铺转让小程序源码门店出租系统定制
热门文章
- kotlin重写构造方法编译报错:Primary constructor call expected
- 使用myeclipse的第一步
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
- 【C#】集合_哈希表_字典_泛型_文件
- 用python下载文件的若干种方法汇总
- view(*args)改变张量的大小和形状_pytorch reshape numpy
- CVPR2020:训练多视图三维点云配准
- 视频动作定位的分层自关注网络:ICCV2019论文解析
- Android线程池简单使用
- Android多进程引发的问题