PageRank

1.    概念

2.    原理


 

3.    java代码实现思路

 
1、定义收敛标准
    每次算出新的pr-oldpr=差值 ,所有页面的差值累加 ,除以pagecount,得到avg差值 ,如果。小于0.01
2、计算总页面数,并且算出每个页面的初始pr值=1/pagecount
3、

    A  0.25 B  D ----- A  0.35 B D--- A  0.29 B D----

 
数据集:
 
一个MapReduce(如何做到循环)
    1. Job的设计
           定义一个收敛值d=0.01,一直循环进行MapReduce操作,当所有页面和上一次计算的pr差值平均小于该标准时,则收敛,跳出循环
  1. boolean flag = job.waitForCompletion(true);
  2. if(flag){
  3. System.out.println(job.getJobName()+" run success");
  4. //获取计数器中的差值
  5. long sum = job.getCounters().findCounter(Mycounter.my).getValue();
  6. System.out.println("SUM: "+ sum);
  7. double avg = sum /4000.0;
  8. if(avg < d){//满足设定的值,跳出循环
  9. break;
  10. }
  11. }
           统计计算的次数i,conf.setInt("runCount", i);便于从上一次的输出中读取数据
                 inputPath和outputPath的设计
  1. Path inputPath =newPath("/user/pagerank/input/pagerank.txt");
  2. //如果不是是第一次计算
  3. if(i >1){
  4. inputPath =newPath("/user/pagerank/output/pr"+(i-1));
  5. }
  6. FileInputFormat.addInputPath(job, inputPath);
  7. Path outputPath =newPath("/user/pagerank/output/pr"+ i);
  8. FileSystem fs =FileSystem.get(conf);
  9. if(fs.exists(outputPath)){
  10. fs.delete(outputPath,true);
  11. }
  12. FileOutputFormat.setOutputPath(job, outputPath);
                 
    2. Mapper的设计
      Mapper端数据的输入--key:Text   value:Text   key:A   value:B   D
             (job端在进行Mapper操作之前,将数据进行了格式处理job.setInputFormatClass(KeyValueTextInputFormat.class);key,value转化为Text格式)
 
      步骤一:获取运行的次数,判断是否是第一次进行map操作,如果是第一次,赋予1.0默认值,然后将value(1.0    B    D)封装为Node对象
      步骤二:将计算前的数据进行输出,key:A    value:1.0    B    D context.write(new Text(page),new Text(node.toString())
      步骤三:如果网页有出链,计算对当前page,对其他网页的出链值key:B    value:0.5  ||  key:D    value:0.5
      
      Mapper端数据的输出:
                                             第一种--key:A    value:1.0    B    D
                                             第二种--key:B    value:0.5  ||  key:D    value:0.5
            
    3. Reducer的设计
        Reducer端数据的输入--第一种--key:A    value:1.0    B    D   第二种--key:A    value:0.5  ||  key:A    value:0.75
        
        步骤一:遍历Iterable<Text>对象,里面有两种数据(value:1.0    B    D  ||  value:0.5
                       无论哪种数据,首先将value转化为Node对象,其次,如果是前者将该node定义为上次的node(sourceNode),否则,获取该node的pageRank(其他网页对该page的投票值),进行sum累加(sum的最终结果也就是本次计算其他page对当前page的投票值总和),比如页面A本次一共获得1.25来自于其他页面的投票
         步骤二:计算新的pr值double newPR = (0.15 / 4.0) + (0.85 * sum);并与之前的也就是上一次的pr值进行比较(上一次的pr值存放在sourceNode中)double d = newPR - sourceNode.getPageRank(); 将差值结果放到累加器中
context.getCounter(Mycounter.my).increment(j);
         步骤三:更新page上一次的pr值--sourceNode.setPageRank(newPR);
         步骤四:数据输出,key:A    value:1.25    B    D--context.write(key, new Text(sourceNode.toString()));
 

 

PageRank_网页排名_MapReduceJava代码实现思路的更多相关文章

  1. ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

    ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...

  2. spring-mvc实现模拟数据到网页展示过程代码

    spring-mvc实现模拟数据到网页展示过程代码 先看看我们的3种模拟数据到网页展示的思路图: 1.当mybatis的环境配置完成.一个动态Web项目建立好.开始导入jar包. -spring的ao ...

  3. 网页排名算法PagaRank

    网页排名算法PageRank PageRank,网页排名,又叫做网页级别.是一种利用网页之间的超链接数据进行计算的方法.它是由Google的两位创始人提出的. 对于用户而言,网页排名一般是比较主观的, ...

  4. PageRank 算法-Google 如何给网页排名

    公号:码农充电站pro 主页:https://codeshellme.github.io 在互联网早期,随着网络上的网页逐渐增多,如何从海量网页中检索出我们想要的页面,变得非常的重要. 当时著名的雅虎 ...

  5. 第十章 PageRank——Google的民主表决式网页排名技术

    搜索引擎的结果取决于两组信息:网页的质量信息,这个查询与每个网页的相关性信息.这里,我们介绍前一个. 1.PageRank算法原理 算法的原理很简单,在互联网上,如果一个网页被很多其他网页所链接,说明 ...

  6. Bootstrap css栅格 + 网页中插入代码+css表格

    设计达人 http://www.shejidaren.com/30-minimal-app-icons.html CSS栅格: <!DOCTYPE html> <html lang= ...

  7. 网页嵌入WMP代码(转)

    网页嵌入WMP代码 播放器代码解释,装了9.0或9.0以上的播放器才能正常使用: OBJECT id="WMP" height="176" width=&quo ...

  8. 总结PHP中几种常用的网页跳转代码

    网页跳转的意思就是指当你在浏览器中访问A页面时,会自动跳转到B页面,往往网页跳转用在404页面中会比较多点.至于怎么实现网页跳转,网上已经提供了很多的方法,有些方法是不可行的,经过测试,叶德华今天就在 ...

  9. TF-IDF_MapReduceJava代码实现思路

    TF-IDF 1.    概念   2.    原理   3.    java代码实现思路 数据集:   三个MapReduce 第一个MapReduce:(利用ik分词器,将一篇博文,也就是一条记录 ...

随机推荐

  1. 如何减轻ajax定时触发对服务器造成的压力和带宽的压力?ajax-长轮训

    AJAX长轮询的方法来解决频繁对后台的请求,进一步减小压力 在实现过程发现AJAX的多次请求会出现多线程并发的问题又使用线程同步来解决该问题 个人对ajax长轮询的一点愚见 ajax请示后台时,后台程 ...

  2. PHP Session的优化使用

    前言 首先说一下,原版session实际并不是很烂,如果你的项目不是高并发项目,完全可以使用原版session. PHP默认的session是以文件形式保存在本地磁盘上的,每次访问实际就是一次io操作 ...

  3. 【bird-java】bird-java概述

    bird-java是以dubbo为基础的分布式服务框架,专注于业务开发,提炼后台应用中的经典业务场景,大幅减少开发编码量. 技术选型 基础框架:spring 服务调度:dubbo web层:sprin ...

  4. Io 异常: The Network Adapter could not establish the connection

    新接触一个项目,导入源码,在本地启动的时候后台报了一个错误: Could not discover the dialect to use. java.sql.SQLException: Io 异常: ...

  5. esp8266 SDK开发之GPIO中断

    先秀一下自己焊的板子,黑的开关用于复位,蓝的开关用于烧录程序. 首先要明确的是esp8622的大多数管脚都有多个功能, 比如可以用来当做GPIO管脚,还可以用来当做SPI管脚. 如下图所示 使用PIN ...

  6. Javascipt数组

    Javascipt数组 在Javascript中数组的做用是:使用单独的变量名来储存一系列的值. 数组只有一个属性,就是length,length表示的数组所占内存空间的数目. <!DOCTYP ...

  7. Python day 6(3) Python 函数式编程1

    一:函数式编程概念 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  8. Scrapy1.4爬取笑话网站数据,Python3.5+Django2.0构建笑话应用

    Part1:需求简要描述 1.抓取http://www.jokeji.cn网站的笑话 2.以瀑布流方式显示 Part2:安装爬虫框架Scrapy1.4 1. 安装Scrapy1.4 E:\django ...

  9. Push to origin/master was rejected (Git提交错误)

    [问题描述] 在使用Git Push代码的时候,会出现 Push to origin/master was rejected 的错误提示. 在第一次提交到代码仓库的时候非常容易出现,因为初始化的仓库和 ...

  10. ASP.NET 设计模式:应用程序分层与关注点分离(SoC)

    应用程序分层设计 应用程序分层属于关注点分离的一种形式,可以通过命名空间.文件夹或采用单独的项目来实现. 下图为一个采用分层设计的项目结构 ASPPatterns.Chap3.Layered.Repo ...