mapreduce-pagerank处理网页出度为0的节点篇

主要思想是借助博客下面博客的内容,其中里面有很多错的,加上自己的深入了解后做了大量改正,
原博客: http://zxxapple.iteye.com/blog/1407199
/**
 * 主要实现思想是当出度为0的网页,把它的PR值分配给全部的网页:
具体实现每次迭代包括两个Job
第一个分散各个节点的PR值
第二个用于将dangling节点的PR值分散到其它节点
主要包括5个类
PageRankNode:图中的节点类-代表一个页面
PageRankJob:实现分散各个节点的PR值的类
DistributionPRMass:实现dangling节点的PR值分散到其它节点的Job类
RangePartitioner:partition类  将连续的节点分配到同一个reduce中
PageRankDirver:整个工作的驱动类(主函数)
 * */
------------------------------------------------------------------------------------------
package com.liu.zxx.Pagerank;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counters;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 
 
/**
 * 主要实现思想在另一篇博客中已经提到:
具体实现每次迭代包括两个Job
第一个分散各个节点的PR值
第二个用于将dangling节点的PR值分散到其它节点
主要包括5个类
PageRankNode:图中的节点类-代表一个页面
PageRankJob:实现分散各个节点的PR值的类
DistributionPRMass:实现dangling节点的PR值分散到其它节点的Job类
RangePartitioner:partition类  将连续的节点分配到同一个reduce中
PageRankDirver:整个工作的驱动类(主函数)
 * */
public class PageRankDirver
{
    public static final int numNodes=5;  //节点数
    public static final int maxiter=10;   //最大收敛次数
 public static void main(String[] args) throws Exception
 {
  long count=0;  //缓存已经接近收敛的节点个数
  int it=1;
  int num=1;
  String input="/Graph/input";
  String output="/Graph/output1";
  do{
   Job job=getPageRankJob(input, output);
   job.waitForCompletion(true);//等待job执行完成
  
//   Counters counter = job.getCounters();
//   count = counter.findCounter(PageRankJob.MidNodes.Reduce).getValue(); // 记录已经收敛的个数
//  
//   if(count!=numNodes)counter.findCounter(PageRankJob.MidNodes.Reduce).increment(0-count);
//   if(count==numNodes)break;     //代表是个网页都收敛拉
  
   input="/Graph/output"+it;
   it++;
   output="/Graph/output"+it;
   System.out.println("job1:input1="+input+";output="+output);//test
      Job job1=getDistrbuteJob(input,output);
      job1.waitForCompletion(true);
     
   Counters counter1 = job1.getCounters();
   count = counter1.findCounter(DistributionPRMass.MidNodes.count).getValue(); // 记录已经收敛的个数  
   if(count!=numNodes)counter1.findCounter(DistributionPRMass.MidNodes.count).increment(0-count);
   if(count==numNodes)break;
     
      input="/Graph/output"+it;
   it++;
   output="/Graph/output"+it;
  
   //if(num<maxiter)
   System.out.println("it:"+it+" "+count);
   //num++;
  }while(count!=numNodes);
 }
 
 public static Job getPageRankJob(String inPath,String outPath) throws Exception
 {
  Configuration conf = new Configuration();
  Job job=new Job(conf,"PageRank job");
 
  job.getConfiguration().setInt("NodeCount", numNodes);//设置参数 他们是key-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值