当前位置: 首页 > 编程日记 > 正文

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

相关文章:

【11平台天梯】【原理分析】11平台天梯原理分析

写作缘由 (Elo Ratings) ELO排名制度是当今对弈水平评估的公认的权威方法。它最初由物理学教授 Arpad Elo 创立&#xff0c;故命名为埃罗排名。埃罗排名最早应用于国际象棋和围棋&#xff0c;目前已广泛用于国际象棋、围棋、足球、篮球等运动。ELO算法先是在网游WOW取得了成功&…

PAT Basic 1072

1072 开学寄语 下图是上海某校的新学期开学寄语&#xff1a;天将降大任于斯人也&#xff0c;必先删其微博&#xff0c;卸其 QQ&#xff0c;封其电脑&#xff0c;夺其手机&#xff0c;收其 ipad&#xff0c;断其 wifi&#xff0c;使其百无聊赖&#xff0c;然后&#xff0c;净面、…

C语言中浮点型在计算机中的存储

一 . 浮点型的存储 在十进制中我们都学习过科学计数法&#xff0c;比如31.4可以用科学计数法表示就是3.14*10^1。浮点型同样是采取科学计数法进行表示的。在计算机中&#xff0c;以二进制数存储&#xff0c;如1011.10用科学计数法的方式可以写成1.01110*2^3&#xff0c;因为浮点…

object-c中管理文件和目录:NSFileManager使用方法

object&#xff0d;c中管理文件和目录&#xff1a;NSFileManager使用方法 对于NSFileManager&#xff0c;文件或目录是使用文件的路径名唯一标识的。每一个路径名都是一个NSString对象&#xff0c;它可以是相对路径名&#xff0c;也可以是完整路径名。 相对路径名是相对于当前目…

python实现ssh登录send_Python实现ssh批量登录并执行命令

局域网内有一百多台电脑&#xff0c;全部都是linux操作系统&#xff0c;所有电脑配置相同&#xff0c;系统完全相同(包括用户名和密码)&#xff0c;ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令&#xff0c;者说进行某些操作&#xff0c;比如安装某些软件&…

传Exchange 15将于今年9月发布

Microsoft Exchange Conference &#xff08;简称MEC&#xff09;是微软公司所举办的有关Exchange Server软件的主题会议&#xff0c;但它在过去的十年间一直没有举行。今年的9月24-26日&#xff0c;微软将在佛罗里达州重新启动MEC并展示Exchange 15。根据ZDNet报道&#xff0c…

Django进阶之session

基于cookie做用户验证时&#xff1a;敏感信息不适合放在cookie中 session依赖cookie session原理 cookie是保存在用户浏览器端的键值对 session是保存在服务器端的键值对 session服务端中存在的数据为&#xff1a; session {随机字符串1&#xff1a;{用户1的相关信息}随机字符…

python画美女代码_教你用python爬取网站美女图(附代码及教程)

我前几篇文章都是说一些python爬虫库的用法&#xff0c;还没有说怎样利用好这些知识玩一些好玩的东西。那我今天带大家玩好玩又刺激的&#xff0c;嘻嘻&#xff01;对了&#xff0c;requests库和正则表达式很重要的&#xff0c;一定要学会&#xff01;一定要学会&#xff01;&a…

Python基础学习3

6 模块和包 (1) 命名以.py结尾的文件就是Python模块 Python的包就是一个文件夹&#xff0c;至少有还有一个__init__.py的文件 包中可以有文件夹&#xff0c;文件夹中可以有包 (2) 文件的导入 每使用一个变量名或者函数时&#xff0c;就需要导入另一个文件 例&#…

CSS伪类 选择器

一、伪类:active/*被激活的元素*/:focus/*拥有键盘输入焦点的元素*/ :hover/*鼠标悬浮在元素上方时*/ :link/*未被访问的链接*/ :visited/*已被访问的链接*/ :first-child/*元素的第一个子元素*/ :lang/*带有指定 lang 属性的元素*/ CSS执行顺序是&#xff1a;lvcha link :hove…

svn中的revert和update

svn中的revert和update今天有人问到revert和update的问题。刚开始还真被问住了。因为感觉revert和update都可以将本地的copy更新到以前的一个版本&#xff0c;会有什么不同呢&#xff1f;查了些资料&#xff0c;并做了个试验&#xff0c;终于发现了它们的不同。假设当前最新的版…

BOM 浏览器对象模型和DOM 文档对象模型

浏览器对象模型BOM 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型&#xff0c;是用于描述这种对象与对象之间层次关系的模型&#xff0c;浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成&#xff0c;其中代表…

上交三月月赛[SJTU] 1106 sudoku

题目大意&#xff1a;给出一道数独题&#xff0c;判断该数独是否有解且有唯一解。 解题思路&#xff1a; 由前几题的难度得&#xff0c;此题的难度不会太过分&#xff0c;所以简单暴力就可以了&#xff0c;40ms用时一本满足。 简单地讲一下具体的实现&#xff0c;从左上开始从左…

C语言-三子棋游戏

C语言中用写头文件的方式写了一个三子棋游戏 1.测试函数text.c #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include"chess.h"void menu() {printf("*************…

取余运算怎么算_TensorFlow2.0(2):数学运算

点击“机器学习算法与Python实战”&#xff0c;“置顶”公众号重磅干货&#xff0c;第一时间送达TensorFlow2.0(1)&#xff1a;基本数据结构——张量1 基本运算&#xff1a;(、-、*、/、//、%) 基本运算中所有实例都以下面的张量a、b为例进行&#xff1a;import tensorflow as …

xen二进制安装

需要几台机器做集群测试,目前只有一台机器所以用xen来虚拟化几台机器出来 系统: centos5.6 安装xen yum install kernel-xen xen修改grub /boot/grub/grub.conf将default1改为default0 default0 timeout5 splashimage(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.…

python模块之json,pickle

序列化是指把内存里的数据转变成字符串&#xff0c;以使其能保存到硬盘上或者通过网络输送到远程。 序列化的两个模块&#xff1a; json:只能把python中的int/str/list/tuple/dict类型的数据&#xff0c;可以在不同的语言之间传递数据。Python和JavaScript数据对应关系&#xf…

关于如何在pc端使用github

http://www.bcwhy.com/thread-17636-1-1.html转载于:https://www.cnblogs.com/glgl2424/archive/2013/03/13/2956944.html

Python爬虫1-Scrapy环境的安装

一. Scrapy环境的安装 1. Scrapy各平台支持情况 除了python3在Windows下不支持外&#xff0c;其余&#xff08;Linux&#xff0c;Mac&#xff09;均支持 2. 安装miniconda (1)建议使用Python2&#xff0c;用miniconda安装scrapy (2)miniconda时Python环境管理工…

汉字笔画数据_统计学原理 数据的预处理

数据审核数据审核—原始数据(raw data)完整性审核应调查的单位或个体是否有遗漏所有的调查项目或变量是否填写齐全准确性审核数据是否真实反映实际情况&#xff0c;内容是否符合实际数据是否有错误&#xff0c;计算是否正确等数据审核—二手数据(second hand data)适用性审核弄…

SqlServer时间函数的使用例子整理

为什么80%的码农都做不了架构师&#xff1f;>>> 整理SqlServer2008的时间函数如下&#xff1a; 1.获取系统时间 select getdate(); --2012-05-06 22:26:49.950 select current_timestamp; --2012-05-06 22:26:49.950 select getutcdate(); --20…

bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理

题面 题目传送门 解法 考虑容斥原理 显然&#xff0c;我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品&#xff0c;\(n\)个人&#xff0c;可以有人没有被分到&#xff0c;那么分给这\(n\)个人的方案数为\(nx-1\choose n-1\) 然后就是分别计算…

Python爬虫2-GET_POST与开发者工具

一. GET_POST与开发者工具 1. 浏览器的基本工作规则 浏览器请求访问服务器&#xff0c;服务器返回数据 (1) 请求的格式 GET&#xff1a;长度不能大于2k参数明文显示在地址栏&#xff0c;不保密&#xff0c;通常用在查询请求 POST:长度可以很大&#xff0c;参数写…

springcloud是什么_阿里P8道出,入职阿里必会199道SpringCloud面试题,你能掌握多少?...

前言Spring Cloud 自 2016 年 1 月发布第一个 Angel.SR5 版本&#xff0c;到目前 2020 年 3 月发布 Hoxton.SR3 版本&#xff0c;已经历经了 4 年时间。这 4 年时间里&#xff0c;Spring Cloud 一共发布了 46 个版本&#xff0c;支持的组件数从 5 个增加到 21 个。Spring Cloud…

不一样的命令行 – Windows PowerShell简介

引子 一直很羡慕Linux的命令提示符&#xff08;当然他们叫Shell&#xff09;。正则表达式&#xff0c;管道&#xff0c;各种神奇的命令&#xff0c;组合起来就能高效完成很多复杂的任务。效率实在是高。流了n年的哈喇子以后&#xff0c;终于有幸用上了Win7&#xff0c;邂逅了cm…

excel中会计专用格式问题_解决方法

excel 2003在使用格式中当选择会计专用会出现负号在左,数字在右的情况.这类设置并不是在excel中完成,而是在控制面板,区域和语言选项---自定义中设置---货币中设置,-&#xffe5;1.1改为&#xffe5;-1.1就可以解决了.包括千位分割样式保留的小数点位数等都可以在这里进行设置来…

Spring.Net Aop

Spring.Net 有四种通知&#xff1a; IMethodBeforeAdvice&#xff0c;IAfterReturningAdvice&#xff0c;IMethodInterceptor&#xff0c;IThrowsAdvice BeforeAdvice 1 using System.Reflection;2 using Spring.Aop;3 public class BeforeAdvice : IMethodBefore…

Oracle to_char函数的使用方法

本文转载于:https://blog.csdn.net/mikyz/article/details/69397030 本文转载于:https://www.cnblogs.com/aipan/p/7941917.html 本文转载于:https://blog.csdn.net/jinlong5200/article/details/3135949 转载于:https://www.cnblogs.com/demon09/p/9485627.html

python装饰器教学_Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容&#xff0c;现学现卖、多练习是好的学习方式。第一步&#xff1a;最简单的函数&#xff0c;准备附加额外功能 # -*- coding:gbk -*-示例1: 最简单的函数,表示调用了两次def myfunc():print("myfunc() called.")myfunc()myfunc()第二…

跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)

最近公司的一个项目里的linux 系统中的oracle 10g数据库&#xff0c;需要把某个表空间里的所有数据都迁移到window 2003的11g里&#xff0c;经过我与dba的交流、测试&#xff0c;决定使用跨平台的表空间传输技术&#xff0c;目前此项任务已经完成&#xff0c;经过测试&#xff…