主要思想是借助博客下面博客的内容,其中里面有很多错的,加上自己的深入了解后做了大量改正,
原博客: 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;
原博客: 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-
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-