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协议 ->…

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

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

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

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

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

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

你的感情路不顺么?

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

在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…

托管PE文件

文/玄魂 中间语言 在.NET框架中&#xff0c;公共语言基础结构使用CLS来绑定不同的语言。通过要求不同的语言至少要实现CTS包含在CLS中的部分&#xff0c;公共语言基础结构允许不同的语言使用.NET框架。因此&#xff0c;在.NET框架中&#xff0c;所有的语言&#xff08;C#、VB.N…

带你见识不一样的世界,这5部豆瓣纪录片不可错过!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片一直都是增长见识又带给你力量的东西&#xff0c;你可能忙于学业、生活、工作而不能行万里路&#xff0c;但至少你还可以看纪录片&#xff0c;从一方屏幕看到整个世界。今天就为大家整理了5部高分纪录片&#xff0c;文末附领取方式…

客户要求ASP.NET Core API返回特定格式,怎么办?(续)

前言上次&#xff0c;我们用客户就要求API的返回值属性名必须是PascalCase&#xff08;如UserName&#xff09;&#xff0c;但是这些API需要同时提供给内部系统使用&#xff0c;默认都是CamelCase&#xff08;如userName&#xff09;。其实&#xff0c;返回的都是JSON格式&…

网吧也用VDI?

升级360以后&#xff0c;挨个菜单都点了一遍&#xff0c;虽然没啥用处&#xff0c;清清垃圾&#xff0c;升级下软件&#xff0c;清理下启动项还是很不错滴。 清理启动项的时候就搞笑了&#xff0c;发现Citrix联机插件居然被360识别为网吧无盘工作站连接中心。ICA Client我想了好…

知乎超高赞:见识多的人,平时都在看些什么?

全世界只有3.14 % 的人关注了爆炸吧知识微信新功能总在悄咪咪更新&#xff0c;“拍一拍”一出&#xff0c;很多小伙伴都会收到各种群里面千奇百怪的“拍一拍”&#xff0c;到底都是谁在偷偷关注你&#xff1f;真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内…

究竟是什么可以比反射还快实现动态调用?| Source Generators版

前言最近在公众号上看到一篇文章《究竟是什么可以比反射还快实现动态调用&#xff1f;》&#xff0c;它使用的是Newbe.ObjectVisitor&#xff0c;基于C#表达式树访问一个普通class的所有属性和对应的值&#xff0c;可以拥有比直接使用反射快上10倍的性能。就这一需求来说&#…

只要懂得拒绝,哪会有什么狗血感情与莫名其妙的误会

1 就凭你&#xff1f;也想握朕的手&#xff1f;2 来&#xff0c;快站好~抱好娃&#xff01;拍全家福啦&#xff01;3 自我约束有利于家庭和谐&#xff0c;嗯&#xff01;4 问题来了&#xff0c;你是夜灯党还是漆黑党&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

android笔记之在WebView中显示ProgressBar的两种方法

http://blog.csdn.net/liuzhidong123/article/details/6450334 本文基于Creative Commons Attribution 2.5 China Mainland License发布&#xff0c;欢迎转载&#xff0c;演绎或用于商业目的&#xff0c;但是必须保留本文的署名http://www.cnblogs.com/luminji&#xff08;包含…

绝对不能错过!2009~2019 高中数学联赛11年真题解析

全世界只有3.14 % 的人关注了爆炸吧知识参加过高中数学联赛的同学都知道&#xff0c;全国高中数学联赛作为中国数学会及各省、市、自治区数学会的一项经常性工作&#xff0c;是属于较高等级的数学竞赛&#xff0c;其地位远高于各省自行组织的数学竞赛。为什么这个竞赛会这么特别…

在Win7中怎样打开摄像头?

在Win7中怎样打开摄像头&#xff1f;标题所说的问题在我装了win7后也遇到了&#xff0c;当时我也只会用等下我说的第一个方法打开摄像头&#xff0c;不过幸运的是我在前些天了解到了另外一个方法&#xff0c;那么现在我先讲下这个问题出现的原因吧&#xff1a;在Win7推出后就因…

活久见啊,WPF工资已经这么高了!

金九银十高薪季&#xff0c;WPF招聘大厂多高薪多&#xff0c;阿里影视、百度地图、华为小米、小鹏特斯拉、美的碧桂园等都在招WPF人才&#xff0c;薪资30w起步&#xff0c;真心太牛了&#xff01;为何WPF上位机自动化能异军突起&#xff1f;其实就是站在了IOT物联网的风口&…