Hadoop学习系列之PageRank

 

昨晚上不想做其他的事,突然想起来好久都没更新博客了,shell也差不多学完了,只不过学习的时候都是只带着书出去了,改天总结总结。Hadoop么,黄宜华老师讲完了,自己也马马虎虎快学完了,也是没总结,那今天就写下前段时间写的一个关于英文Wiki的PageRank代码吧。

PageRank的ABC

什么是PageRank

PageRank是一种在搜索引擎中根据网页之间相互的链接关系计算网页排名的技术。

PageRank是Google用来标识网页的等级或重要性的一种方法。其级别从1到10级,PR值越高说明该网页越受欢迎(越重要)。

 

PageRank的基本设计思想和原则

被许多优质网页所链接的网页,多半也是优质网页。

一个网页要想拥有较高的PR值的条件:

  1. 有很多网页链接到它;
  2. 有高质量的网页链接到它

PageRank的简化模型

可以把互联网上的各个网页之间的链接关系看成一个有向图。

对于任意网页Pi,它的PageRank值可表示为:

 

其中Bi为所有链接到网页i的网页集合,Lj为网页j的对外链接

 

简化模型面临的缺陷

  实际的网络超链接环境没有这么理想化,PageRank会面临两个问题:

  1. Rank leak:就是有的网页没有链出网页,使用上面的公式时,循环几次后所有的PageRank值都变为0
  2. Rank sink:整个网页图中的一组紧密链接成环的网页如果没有外出的链接就产生Rank sink,即经过若干次循环后不在环中的网页的PR值会变为0

解决简化模型的缺陷的解决办法——采用随机浏览模型:

  假定一个上网者从一个随机的网页开始浏览

  上网者不断点击当前网页的链接开始下一次浏览

  但是,上网者最终厌倦了,开始了一个随机的网页

  随机上网者用以上方式访问一个新网页的概率就等于这个网页的PageRank值

  这种随机模型更加接近于用户的浏览行为

采用随机浏览模型后的PR值计算公式变为

 

其中d为按照超链进行浏览的概率,1-d即为用户随机跳转一个新网页的概率,显然跳转到每个网页的概率为(1-d)/N,N为所有网页的数目。

 

依据上述公式,一般经过10次左右的计算,每一个网页可以得到一个稳定的PR值(数学证明使用马尔可夫链收敛定理,不太懂,有兴趣的同学可以关注下)

 

使用MapReduce实现PageRank

显然这样一个需要进行大量累加计算的工作是适合用MapReduce来做的,那么怎么做呢?分三个阶段完成这个事情:

  Phase1: GraphBuilder

  建立网页之间的超链接图

  Phase2: PageRankIter

  迭代计算各个网页的PageRank值

  Phase3: RankViewer

  按PageRank值从大到小输

 

具体设计:

En_wiki中每行对应于一个页面,页面的标题包含在“&lttitle&gtName of thearticle&lt/title&gt”中,每个页面的链出标题在一对双中括号中("[[Name of other article]]"),我们需要做的就是用PageRank算法给出每个页面的重要性,并按重要程度从高到低输出。首先要做的就是构建每个页面的链接关系图,这个工作我们GraphBuilder类来实现,给出的结构类似于图的邻接表表示方式;第二步需要做的工作就是用PageRank算法经过一定次数的迭代,得出最终每个页面的PRValue,具体算法在PageRankler类中实现;第三步需要将结果展现出来,并按“PRvalue           title”的格式降序输出,类PageRankViewer实现该功能;最后,需要组织整个算法,这是main函数完成的功能。

以下具体阐述每个类的具体实现:

1.           整体类视图

 

2.           GraphBuilder类

map中完成链接图的构造。首先需解决的问题就是如何提取出title及linktitle,我们使用正则表达式来完成:"(?<=&lttitle&gt)(.*?)(?=&lt/title&gt)"来完成对title的匹配,使用"(?<=\\[\\[)(.+?)(?=\\]\\])"来完成对linktitle的匹配。此处需要主要注意的在第二个匹配模式中,由于'['和']'属于正则表达式中的元字符,因此需要对其进行转义,在Java语言的字符串中还要对转义字符进行一次转义,因此会出现两个反斜杠。提取完成之后,key设为title,初始PRValue和链出列表以“PRValue%%%%link1   link2      link3      ...”的格式作为value发射出去。key和value的类型都是Text。

reduce阶段不需要做额外的工作,将map阶段给的键值队原样发射出去即可,可以使用默认的reduce来做,此处还是自己实现。

main11函数完成整个job的参数设置及运行该job,如果使用默认的reduce,此处需要具体设置map输出的key、value以及输出的key、value的类型,否则会出现一个类型不匹配的错误。由于输出文件还要在下一个job中作为输入,因此输出类型设为二进制类型(SequenceFileOutputFormat),在下一步中奖输入格式设为二进制后,map可以自己识别出key和value。另外需要做的工作就是,如果输出目录存在需要将其删除,然后开始执行job。

3.           PageRankler类

map的输入和输出的key和value都为Text类型,需要做的工作是继续维护图的结构以及“分饼”工作,即将自己的PRValue均分到每个链出的title上。从读入的value中得到自己的PRValue和链出的title,由于value的格式为:“PRValue%%%%%%link1 link2      link3      ...”因此用两次split就可以得到PRValue和linktitle数组。对linktitle数组中的每个元素都分配PRValue并发射出去,发射的key为linkTitle,value为PRValue/linktitle.length(),最后将图的结构“link1       link2      link3      …”发射出去。

需要自己定制combiner,因为一个页面中出现相同的linktitle是有可能的。如果发来的图结构,不处理直接发射出去,如果不是,进行简单的累加后发射。

redece阶段对title从每个链接源得到的PR值进行合并得到PRValue,然后按照公式:newPR = (1 - d) + d * PRvalue得到newPR,注意此处随机浏览的概率设置为1-d而不是(1-d)/N,主要是相对非常大的N,(1-d)/N小到可以忽略。刚开始的时候,我试图在GraphBuilder中的map中得到N,设置了一个全局静态变量,在map处理一行的时候对该变量加一,在本机上这个机制是有作用的,但是到集群上之后,得到的所有PRValue都是无穷大,后来领悟到:map是在各个节点上做的,所以N值不会变化,而是初始的值0,后来自己想写一个job得到N,发现没有任何意义,舍弃之。得到新的PRValue后,将value设为“PRValue%%%%link1       link2      link3      ...”发射,供下轮job使用。

isDouble函数完成对一个字符串是否为一个浮点数进行判断,这个函数用在map阶段,用于判断一个value是图结构还是分到的PRValue。

main11对整个job进行设置,输入输出格式都设为二进制,其他的与上个阶段的main11做的事基本相同。

4.           PageRankViewer类

map阶段所做的事是将value中的PRValue提取出来,然后将key设为PRValue,value设为title,发射。

因为要求按降序输出,故此处还要写自己的Comparator,只需要返回父类的相关函数的返回值的相反值即可。

main11函数设置相关的参数和输入输出值的类型,基本同上个类。

5.           main函数

main函数完成对所有job流程的控制,包括设置输入输出路径以及参数检查,还有设置PageRank的迭代次数等等。

 

运行结果:

本次实验将所有title的初始PRValue设置为0.5,阻尼系数设置为0.85,PageRank迭代次数设为10次,在集群上的运行结果的前30个title列表及其PRValue值如下图所示:

 代码就不贴了,按照这个思路实现起来应该很简单的

转载于:https://www.cnblogs.com/BigBesom/archive/2012/05/15/2500891.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

您的屁股发热严重,请降温后使用。

▲ 点击查看不是坐在办公椅上的屁股都渴望自由&#xff0c;而是——最近天越来越热&#xff0c;屁股捂在椅子上&#xff0c;既不散热也不排汗&#xff0c;比戴口罩闷出痱子还难受&#xff0c;实在是坐不住。。最尴尬的就是站起来裤子时常黏在屁股缝里&#xff0c;难不成每次还要…

C# 正则表达式编写及验证方法

01—前言正则表达式应用很广泛&#xff0c;应该大多人都接触过了&#xff0c;这个语法规则既多又凌乱&#xff0c;每次用的时候都得重新看一遍语法&#xff0c;真的是让人头疼啊&#xff01;但是实际上我们并不要掌握很多的符号用法规则&#xff0c;牢记最常用的几个就能应付很…

Domino Web开发规则之二:DOMINO与开发相关的管理规范

1.服务器HTTP优化设置 调整活动线程数&#xff0c;HTTP服务器可以同时处理的请求数&#xff0c;而非连接数、会话数 单CPU服务器<64 多CPU服务器<80 并发运行Web代理 确保Web代理是线程安全的情况下&#xff0c;可以启用来提高性能。 服务器文档-> Internet协议 ->…

python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

什么是爬虫&#xff1f;网络爬虫(又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者)&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟…

Linq-语句之Select/Distinct和Count/Sum/Min/Max/Avg

上一篇讲述了LINQ&#xff0c;顺便说了一下Where操作&#xff0c;这篇开始我们继续说LINQ to SQL语句&#xff0c;目的让大家从语句的角度了解LINQ&#xff0c;LINQ包括LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML&#xff0c;但是相对来说…

【HDU】2795 Billboard

1 #include<cstdio>2 #define MAXN 2000103 #define MIN(a,b) ((a)>(b)?(b):(a))4 #define MAX(a,b) ((a)>(b)?(a):(b))5 int w,tree[MAXN<<2];6 inline void PushUp(int rt)7 {8 tree[rt]MAX(tree[rt<<1],tree[rt<<1|1]);9 } 10 void Bui…

老师一定没有教!9个数学速算技巧!看到第1个就跪了!

全世界只有3.14 % 的人关注了寄语 与世界上的其他学科一样&#xff0c;数学也有自己的奇妙之处。由于各种各样的原因&#xff0c;老师没有将这些秘密告诉我们。下面就是一些有趣的数学技巧&#xff0c;看完后你也许会爱上这门学科。▼不管是几个1的平方&#xff0c;都是有规律…

Java类的继承总结

本文主要是讲述Java类的继承&#xff0c;更多Java技术知识&#xff0c;请登陆疯狂软件教育官网。加疯狂软件官方微信号&#xff1a;fkitorg,免费赢大奖&#xff0c;有机会赢得iOS培训课程一套。  在生活中我们往往把许多东西归为一个整体&#xff0c;如球有篮球&#xff0c;足…

《程序员》杂志2011年第5期.pdf 下载链接 首发。

csdn《程序员》杂志2011年第5期.pdf 程序员 2011 5月刊 pdf 请下载后24H之后删除。购买原版。谢谢。 下载链接: http://ishare.iask.sina.com.cn/f/15850972.html

愚蠢的领导才会用程序员祭天!!

“人非圣贤&#xff0c;孰能无过网络上频频流出程序员误删线上数据库&#xff0c;造成XX公司XX万损失的新闻&#xff0c;进而牵扯出“杀一个程序员祭天”的妙语&#xff0c;虽然杀一个程序员比杀一个进程要难很多&#xff0c;但也充满着讽刺的味道。程序员每天都往返于代码和服…

一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案

面试最重要的考试环节就是试讲&#xff0c;而想要进行一次优秀的表演&#xff08;试讲&#xff09;&#xff0c;则需要一个过硬的剧本&#xff08;教案&#xff09;&#xff0c;那我们如何写出一篇完美教案呢&#xff1f;今天上元教师就教给大家10分钟速写一份教案的方法&#…

php smtp验证,php通过smtp验证登陆

内网的系统为了统一账号&#xff0c;都采用用邮件账号登陆的方式&#xff0c;所以有了以下程序/** * 通过邮件 验证登陆 * 这里要明白的是用户名是 带域名的&#xff1a;aaa163.com */ function valideEmailLogin($user, $pass, $smtp_server smtp.163.com, $port25) { $handl…

你的感情路不顺么?

1 你的感情路不顺么&#xff1f;2 扎心了&#xff01;3 哈哈哈哈没毛病&#xff0c;差一点就信了&#xff01;4 这个反杀&#xff0c;满分&#xff01;5 一只认认真真学揉面的猫咪6 当你妈说你该出门运动下的时候。。 你点的每个赞&#xff0c;我都认真当成了喜欢

小算法

重新看C语言时&#xff0c;一个小发现&#xff0c;在交换两个变量的值时&#xff0c;一般设个变量&#xff1a; int a 13, b 27; int c; c a; a b; b c; 还可以不用中间变量&#xff1a; a a b; b a - b; a a - b; 或&#xff1a; a a ^ b; b b ^ a; a a ^ b; …

在zabbix中添加监控主机及Items

在http://ly36843.blog.51cto.com/3120113/1640289我们学习了zabbix的server和agent的编译安装方法 这里我们添加监控主机和监控一、添加一个主机填写监控主机的相关选项主要填写&#xff1a;主机名称&#xff0c;选择哪个组即可查看添加后的结果二、添加Items从上面的结果中我…

WPF实现聚光灯效果

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言效果仿照 CSS聚光灯效果 https://www.jianshu.com/p/6eae322e8e3801—效果预览更多效果请下载源码体验一、SpotLight.cs 代码如下using Syst…

python8皇后不攻击问题_Python八皇后问题(落最后一颗子)

最近在看Python基础&#xff0c;遇到了八皇后问题&#xff0c;看得整个人晕晕乎乎&#xff0c;甚至开始怀疑人生。问题是在一个8*8的国际象棋棋盘上摆放8个皇后&#xff0c;问题一是找出一个解&#xff0c;问题二是问有多少个解。这里我把我自己的理解写出来&#xff0c;只针对…

Could not find result map

"Exception: org.apache.ibatis.builder.xml.IncompleteStatementException: Could not find result map....." 在使用mybatis 3 和spring 3整合的时候&#xff0c;往往粗心的人会在过程中出现以上错误。--------------------------原因是: ***-mapper.xml文件中的 r…

php中unset面试题,php unset和引用——由一道php面试题引发的思考

$test"aaaaa";$abc&$test;unset($test);echo $abc;为什么结果会输出aaaaa呢&#xff0c;$test不是销毁了吗&#xff1f;$abc引用一个销毁的怎么输出的不是空白呢&#xff1f;查了下资料&#xff0c;将原因分析如下&#xff1a;变量存储数据时可以理解为变量的值放…

python下载matplotlib.finance模块_关于Matplotlib中No module named 'matplotlib.finance'的解决办法...

最近在研究量化分析&#xff0c;需要用到matplotlib中的一个库&#xff0c;输入from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc发现有报错&#xff0c;仔细勘查后发现有两个问题&#xff0c;一个是matplotlib模块已经剔除了&#xff0c;所以得…