mapReduce编程之google pageRank
1 pagerank算法介绍
1.1 pagerank的假设
数量假设:每个网页都会给它的链接网页投票,假设这个网页有n个链接,则该网页给每个链接平分投1/n票。
质量假设:一个网页的pagerank值越大,则它的投票越重要。表现为将它的pagerank值作为它投票的加权值。
1.2 矩阵表示形式
aaarticlea/png;base64,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" alt="" />
.........
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZwAAAAyCAIAAADnQvpEAAAKTElEQVR4nO1d7aGkKgylBWuwBXuwBGuwBTuwg+nACqzABmzADujB9yPvns0lEPFjnFk359euFyGEcBICOG41GAyGB8F9WgCDwWC4EkZqBoPhUTBSMxgMj4KRmsFgeBSM1AwGw6NgpGYwGB4FIzWDwfAoGKkZDIZHwUjNYDA8CkZqBoPhUTBSMxgMj4KRmsFgeBSM1AwGw6NgpGYwGB4FIzWDwfAoREit73uXRlVVbdtO0xS8Vde18lZRFHVdv14v732quWEYNEGdc871fX+yw5nQu1PXddd1y7JEhUyhLMumafRueu+rqirLMqiTP5GADk/2Vz5/vV7OuXEc91ZIIuWMl67qALcZwGFM00SiBnNkGIbX68WffLxHdV3Xdd22bd/38zwrJed57vu+aZqqqs4IvCxL0zT54tFc29vKblIDuq6TEmyiLMuAC9BcURSS8v4Ieq8F5HSnKIqAoXI04NRx6rrO/Z4PeEvp+0lS018vy1IfGqVO6fwk/gVSoz4Gwn+8R1zzbdsqJZumOT8E4zgWRZFvpW8htegL8zxDF9yB6xLM89y2bXRKcw5VWPxmC9C7M45jWZbOuaIoOEfrQo7jCNVFy9B8CBrlUzrlTs+Q2jAMqD9agKTKdLBd17VtO88zVTtN0zRNFAvki5QKdv5efJy/oiBrhCWninnvqcDJXpxfT2RiN6kRSBF8TZRDq7SWCSZnEBim7PirSG1d12VZpIvLEZKcXtSGSKuBBrhyUvIcMxfvPTyN/jppI4diYPqwEPw3XzAjtXsAI6+qStE2+SeYymNJDe4dcUpmrCj1wpefZP3Rlc63kdq6rjTMMv+lC6nkXKItcuU454K8DOGAuUzTBMZB5anC4zjmDO66rsuyjOPIx7Tv+2EYZP5Rl81I7QbAyCnaCBJKALlhsoEnk5o0u/OkBq1FlfuFpCYVdYbUiGLkNgLqJHcaLHhTkmwCpDMMQ35snskyRPekw9RUUbBJaijgvacspHOuqiqsAJZl6bqO54zKspQbXLzjPDlQlmXf99K5LsvSti2cQVVVcr8oEF5mDGFUKWuhXA1vRXoy3so8z03TkGcqiqJt20wXAiOnZUcqmi6KghYWKYGHYWiaBgK7H6KEAiEtB9dP3/fwskVRkM0EcxB5vSAJ473HsoBavJXUaHHuEqTG5ZbWnFJoSngdm5PzfaQG7uYy8FkalEed8zzDYjYl2YRzrm1bai7ndeKOnMwaGG1dVyLiva4on9T48hkr+mEYEHtKcLeBjgfLcEJVVXw45nmOVlsUBZ9mJ0mNpzgVYaIaSImUAjdy4gX5FpkrjbsU2Huv7PNA5k1SAykTiMSDOei9pzKB/cOrwVrOLj+h6BwWQPPRnNq6rsuykNxVVQXvRi1AEV7HJaRG9sRFzRESARd/SJqJNsfrhAKDMxYHSI0785zXwcWb26DjOMKa53muqmrvKjKf1NwPNXvvSSfchGBm3vvX64VYRnac5hWVp2MHfHYRaNrz7mA7j8c4UeGjhiEfQsl1XZMwJDk95JbGNVBVFfXde48e5bgfbuRkWjKsJiMnTyAFhkHyuIzvJXIFRs0MJYuiII1N00TGKecgaAfVwtNzyY+QGuI93p7OAtM0wVBSu5/0XwzhZ/e/N0kN2uQiKULSrCNGk2VIn9EXeXloPjhj8dYjHZBfztU3IZ/U5IqJ7Cd6BkX6VHRcDnRg4dgXCtwJaAh1niG1lEdHK5jMaEX2FLGb1FsAbuRkz1KfJNL/y7qEwNJuYS2cW3VSk4mX6Bykh0jCIETgSthHat77YRgwM3nAlXnaqK7rYAxkc6iK1x81i/dBIbVlWeD2g22NHA24mD+k59EzrkHHYc2b5pKPzNdTFnw58kltV8IO3US1PJ8bFCYfDAOAD4tu1GwKH7Xe4GE0LwGQQYLvFA0gLNDlXIWR0/jyScfXnqlepECF+QzSSU06oegcRCRO54Siw3f88G3ArJs3ClKH6WVXo8mjXQo9j8zDt0EOQi8fzVWvW3NYdlxmHu8hNdKJfkrzEuST2ibFLMsyTdPr9eJZG6m31N4Lt0C83ratcsXiMKlRi6nzYgFVoRU5p/AnRS2EgDUoxOMsSU+g5GgvgqbHcey6DnFPJqlFe50KLKAKglxo7ya11A2hqARIOiBHoDQXfZiv0GuhkJpy5UsKyXMiSMwH2EtqyJgiTryT1A6c8N6LfFJTjlYpI5jjDOSfEEnBDKLsdpjUgthQr1bRQP6BmGBAqYN8BUpmhske7UWwIxwgk9Sivd78k0vkGQ5uFORLgD2j1I5MqrngBENUoUptOi7ZKJBICYkEZ7CHRdhLaiubYORXAx1GN5uUXj+M1IINQVy5ldtku0ht/Z0aBoqi4AHjYVLbzErzat9BautvFiMb0/fB5I4wBT3RxdaFpIZAIb63Jh9dS2rr77SucqE99RbVGTULRXgdN5MaF0xGywdIbWXOapomIzUA/qNpmtSptMOkRqDMctu2fD7LpOebIjWKDN5EaiQDcXSw9oz2AttW8nw1FX4HqSGtRpApiDtIbWUbT3JKK83xEwxRs3gfLie19Sf2lMNwjNT42YV/NqcmC5CSowN3Falx4EwcVm1vyqml/Na1pEYugaKzYO0pBdZ3Nt5HakjD4R9BqHQTqeEsglSB7hLhCh5AaojJI8PgnEt8fEmpE0H45j0nHX/v7ueuQ9o8tqUn+aQGVW8uNW7e/byW1HAUg/obnPAIBFa0FyyzlPJ7SQ0DQUltsskgVLqJ1Nb0IlRvLlhJ/dWktqYXocrJe73OIB2+S1oplVIGB7W+6pyaLEBeUIaT/KT+AVJD9+ViJ7gCfPM5tWtJDQ9JjcF5kUBgeQGcQN8EpD9dS2ryUgE4ju/Y3EdqK8vg8oHcbO6SbzntxZtIbf2ZdYHN0UJbWvNmnYj+DgwZkDPimFfHmtiFM6TGbYx8J90D5Vo6tvzk1wyoZn6CPyenRp5M2UyEknEdIrhRIG9TXk5q/MBE9MQSBAbRB7csgkugUqXzPNMlkJQMKfHwhRtOo3IReiupgWhd7FR3zlsPILVoxApuyjkmEoDvjeySVtaglCGyuCGhtp4jNR4mcJRlKeOdXaSWqjlQS1Q27pgR00VHdu/dz8tJDVQlbxdIgVPS0mf13O8UYeCAKdmST2qpxDqq/XNIWNb1PlJbmRZQMqc5vPUAUlsTEStNGOUrHUqF8I27pAVyhoD8yg1rz/X0kQ76TlzwlYtoXLB3o4BCM1Bb9Eh5VDbvPXgN8zw1stM08a3Vuq6VE7aXk9r6Y4rSgUUF5l83obN7yqGTYRgwLtFb6ynxENlEVzMYLFqE3rGaMOSAbzx9G1LfejMYvhBGal+EXd8suxN19pdvDYaPw0jtizDFfqPg45j2/EaBwfBxGKl9F+SvSX0cVVVFP7drMHwnjNS+C/J3Pz+Lw7/7aTB8CkZqBoPhUTBSMxgMj4KRmsFgeBSM1AwGw6NgpGYwGB4FIzWDwfAoGKkZDIZHwUjNYDA8CkZqBoPhUfgPJcBIAxRwYdgAAAAASUVORK5CYIIA" alt="" />
最终PR值会收敛为稳定值。
1.3 deadends和spider traps
deadends:一个网页没有链接,则最终PR值会收敛为全为0;
spider traps:一个网页只有指向自身的链接,则最终PR值会收敛为该网页为1,其他全为0。
解决方法:
aaarticlea/png;base64,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" alt="" />
2 mapReduce流程
2.1 输入数据格式
aaarticlea/png;base64,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" alt="" />
aaarticlea/png;base64,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" alt="" />
2.2 总体流程
2.3 MR1
maper1负责读入relation.txt,将数据分割为小单元,计算小单元的转移概率,以小单元的列号为key发送。
maper2负责读入PR.txt,分割为小单元,按行号为key发送。
reducer负责将接收到的pr值与转移概率值一一相乘,再乘以beta-1,然后按行号写入HDFS,
2.4 MR2
maper1从HDFS读入数据,发给reducer。
maper2读取pr.txt,每个单元乘以beta后发往reducer。
每个reducer将接收到的所有乘积相加,得到一行的结果。
2.5 主要代码
UnitMultiplication.java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.chain.ChainMapper;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class UnitMultiplication { public static class TransitionMapper extends Mapper<Object, Text, Text, Text> { @Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString().trim();
String[] fromTo = line.split("\t"); if(fromTo.length == 1 || fromTo[1].trim().equals("")) {
return;
}
String from = fromTo[0];
String[] tos = fromTo[1].split(",");
for (String to: tos) {
context.write(new Text(from), new Text(to + "=" + (double)1/tos.length));
}
}
} public static class PRMapper extends Mapper<Object, Text, Text, Text> { @Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] pr = value.toString().trim().split("\t");
context.write(new Text(pr[0]), new Text(pr[1]));
}
} public static class MultiplicationReducer extends Reducer<Text, Text, Text, Text> { float beta; @Override
public void setup(Context context) {
Configuration conf = context.getConfiguration();
beta = conf.getFloat("beta", 0.2f);
} @Override
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
List<String> transitionUnit = new ArrayList<String>();
double prUnit = 0;
for (Text value: values) {
if(value.toString().contains("=")) {
transitionUnit.add(value.toString());
}
else {
prUnit = Double.parseDouble(value.toString());
}
}
for (String unit: transitionUnit) {
String outputKey = unit.split("=")[0];
double relation = Double.parseDouble(unit.split("=")[1]);
//transition matrix * pageRank matrix * (1-beta)
String outputValue = String.valueOf(relation * prUnit * (1-beta));
context.write(new Text(outputKey), new Text(outputValue));
}
}
} public static void main(String[] args) throws Exception { Configuration conf = new Configuration();
conf.setFloat("beta", Float.parseFloat(args[3]));
Job job = Job.getInstance(conf);
job.setJarByClass(UnitMultiplication.class); ChainMapper.addMapper(job, TransitionMapper.class, Object.class, Text.class, Text.class, Text.class, conf);
ChainMapper.addMapper(job, PRMapper.class, Object.class, Text.class, Text.class, Text.class, conf); job.setReducerClass(MultiplicationReducer.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, TransitionMapper.class);
MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, PRMapper.class); FileOutputFormat.setOutputPath(job, new Path(args[2]));
job.waitForCompletion(true);
} }
UnitSum.java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.chain.ChainMapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException;
import java.text.DecimalFormat; public class UnitSum {
public static class PassMapper extends Mapper<Object, Text, Text, DoubleWritable> { @Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] pageSubrank = value.toString().split("\t");
double subRank = Double.parseDouble(pageSubrank[1]);
context.write(new Text(pageSubrank[0]), new DoubleWritable(subRank));
}
} //add a new mapper to read pageRanki.txt, which will add beta*e to result sum
public static class BetaMapper extends Mapper<Object, Text, Text, DoubleWritable> { float beta;
@Override
public void setup(Context context) {
Configuration conf = context.getConfiguration();
beta = conf.getFloat("beta", 0.2f);
} @Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
String[] pageRank = value.toString().split("\t");
double betaRank = Double.parseDouble(pageRank[1]) * beta;
context.write(new Text(pageRank[0]), new DoubleWritable(betaRank));
}
} public static class SumReducer extends Reducer<Text, DoubleWritable, Text, DoubleWritable> { @Override
public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
throws IOException, InterruptedException { double sum = 0;
for (DoubleWritable value: values) {
sum += value.get();
}
DecimalFormat df = new DecimalFormat("#.0000");
sum = Double.valueOf(df.format(sum));
context.write(key, new DoubleWritable(sum));
}
} public static void main(String[] args) throws Exception { Configuration conf = new Configuration();
conf.setFloat("beta", Float.parseFloat(args[3]));
Job job = Job.getInstance(conf);
job.setJarByClass(UnitSum.class); ChainMapper.addMapper(job, PassMapper.class, Object.class, Text.class, Text.class, DoubleWritable.class, conf);
ChainMapper.addMapper(job, BetaMapper.class, Text.class, DoubleWritable.class, Text.class, DoubleWritable.class, conf); job.setReducerClass(SumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class); MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, PassMapper.class);
MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, BetaMapper.class); FileOutputFormat.setOutputPath(job, new Path(args[2]));
job.waitForCompletion(true);
}
}
Driver.java
public class Driver { public static void main(String[] args) throws Exception {
UnitMultiplication multiplication = new UnitMultiplication();
UnitSum sum = new UnitSum(); //args0: dir of transition.txt
//args1: dir of PageRank.txt
//args2: dir of unitMultiplication result
//args3: times of convergence
//args4: value of beta
String transitionMatrix = args[0];
String prMatrix = args[1];
String unitState = args[2];
int count = Integer.parseInt(args[3]);
String beta = args[4];
for(int i=0; i<count; i++) {
String[] args1 = {transitionMatrix, prMatrix+i, unitState+i, beta};
multiplication.main(args1);
String[] args2 = {unitState + i, prMatrix+i, prMatrix+(i+1), beta};
sum.main(args2);
}
}
}
mapReduce编程之google pageRank的更多相关文章
- MapReduce编程之wordcount
实践 MapReduce编程之wordcount import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fi ...
- mapReduce编程之auto complete
1 n-gram模型与auto complete n-gram模型是假设文本中一个词出现的概率只与它前面的N-1个词相关.auto complete的原理就是,根据用户输入的词,将后续出现概率较大的词 ...
- mapReduce编程之Recommender System
1 协同过滤算法 协同过滤算法是现在推荐系统的一种常用算法.分为user-CF和item-CF. 本文的电影推荐系统使用的是item-CF,主要是由于用户数远远大于电影数,构建矩阵的代价更小:另外,电 ...
- MapReduce编程之Reduce Join多种应用场景与使用
在关系型数据库中 Join 是非常常见的操作,各种优化手段已经到了极致.在海量数据的环境下,不可避免的也会碰到这种类型的需求, 例如在数据分析时需要连接从不同的数据源中获取到数据.不同于传统的单机模式 ...
- MapReduce编程之Semi Join多种应用场景与使用
Map Join 实现方式一 ● 使用场景:一个大表(整张表内存放不下,但表中的key内存放得下),一个超大表 ● 实现方式:分布式缓存 ● 用法: SemiJoin就是所谓的半连接,其实仔细一看就是 ...
- MapReduce编程之Map Join多种应用场景与使用
Map Join 实现方式一:分布式缓存 ● 使用场景:一张表十分小.一张表很大. ● 用法: 在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeC ...
- Hadoop基础-Map端链式编程之MapReduce统计TopN示例
Hadoop基础-Map端链式编程之MapReduce统计TopN示例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 对“temp.txt”中的数据进行分析,统计出各 ...
- Casbin入选2022 Google编程之夏
Casbin入选2022 Google编程之夏! Google编程之夏(Google Summer of Code,GSoC),是由Google公司所主办的年度开源程序设计项目,第一届从2005年开始 ...
- Android网络编程之HttpClient运用
Android网络编程之HttpClient运用 在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们 ...
随机推荐
- Java关键字——transient
当使用Serializable接口实现序列化操作时,如果一个对象中的某一属性不希望被序列化,则可以使用transient关键字进行声明 import java.io.File; import java ...
- Java观察者设计模式
在java.util包中提供了Observable类和Observer接口,使用它们即可完成观察者模式. 多个观察者都在关注着价格的变化,只要价格一有变化,则所有的观察者会立即有所行动. //==== ...
- C++ Pointer-to-Member Selector
http://www.codeguru.com/cpp/cpp/article.php/c17401/C-Tutorial-PointertoMember-Function.htm https://m ...
- tmpfs——Linux的一种虚拟内存文件系统
虚拟内核文件系统(VirtualKernel File Systems),是指那些是由内核产生但不存在于硬盘上(存在于内存中)的文件系统.例如 1.proc proc文件系统为操作系统本身和应用程序之 ...
- python中单引号,双引号,多引号区别
先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行如:s1 = "hello,world"如果要写成多行,那么就要使用\ (“连行符”)吧,如s2 = " ...
- org.hibernate.QueryException: could not resolve property
org.hibernate.QueryException: could not resolve property HibernateSQLXML org.hibernate.QueryExcepti ...
- [Html5]sessionStorage和localStorage的区别
摘要 有时需要在浏览器中保存一些数据,特别在app中嵌入的h5页面中,需要在webview中保存一些数据,作为客户端的数据持久化. h5中web storage有两种存储方式:sessionStora ...
- 黄永成-thinkphp讲解-个人博客讲解26集
如果是要导入 前后台分组都公用的 第三方类库, 就将类库(*.class.php文件) 放在 App下的Class文件夹中. 导入方法是: import('Class.Image', APP_PATH ...
- php防注入
引发 SQL 注入攻击的主要原因,是因为以下两点原因: 1. php 配置文件 php.ini 中的 magic_quotes_gpc选项没有打开,被置为 off 2. 开发者没有对数据类型进行检查和 ...
- AD域服务器|两台DC无法进行复制同步
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:前段时间公司两台域控出现了一些问题导致数据无法相互进行同步,DC之间也无法进行共享访问,网络用户无法通过计算机名映射的共享访问 ...