【大創_社群劃分】——PageRank演算法MapReduce實現
PageRank演算法的分析和Python實現參考:http://blog.csdn.net/gamer_gyt/article/details/47443877
舉例來講:
假設每個網頁都有一個自己的預設PR值,相當於人為新增給它是一種屬性,用來標識網頁的等級或者重要性,從而依據此標識達到排名目的。假設有ID號是1的一個網頁,PR值是10,假如它產生了到ID=3,ID=6,ID=8 ,ID=9這4個網頁的連結。那麼可以理解為ID=1的網頁向ID=3,6,8,9的4個網頁各貢獻了2.5的PR值。如果想求任意一個網頁假設其ID=3的PR值,需要得到所有的其他網頁對ID=3這個網頁的貢獻的總和,再按照函式“所求PR”=“總和”*0.85+0.15得到。經過迴圈多次上述過程求得的網頁PR值,可以作為網頁排名的標識。
1:準備資料
理論資料是通過網頁爬蟲得到了某個特定封閉系統的所有網頁的資訊,為了測試程式,可以自己模擬生成自己定義特定格式的資料。下面是我用來測試的資料,儲存方式如圖
(注:對於自定義模擬資料,在PR初始值的選取時,所有的網頁是“平等”的,不會說自己寫的網頁和Google的熱門網頁有多少差別,但是按照某種法則經過一定運算後PR是不一樣的,比如很多其他的網頁可能會連結到google,它的PR自然會比你的高。所以初始值的選取按照這種邏輯來講符合現實些,即所有網頁預設PR值相等。但是即使初始值定的不一樣,整個系統的PR總和可能會變化,最後的每個網頁PR也會發生變化,但是這種量之間的變化,不會影響到網頁自身的通過比較大小方式上的邏輯排名。
2:MapReduce過程
map接受的資料格式預設是<偏移量,文字行>這樣的<key,value>對,形如<0,1 5 2 3 4 5><20,2 10 3 5 8 9>.
目標 :將預設資料格式,轉換成自定義格式<key,value>對。
已知 :hadoop框架在Map階段的時候會自動實現sort過程,就是將相同的key的所有value儲存到list,形如<key,list(1,1,1,2)>這種形式,例如上述對ID=2的網頁有ID=1,6,7,8.這4個網頁貢獻(1.25,1,5/3,5),那麼如果你採用的key是網頁ID,那麼hadoop框架會以此種形式<2,list(1.25,1,5/3,5)>輸出,傳遞給reduce。
Reduce階段:
分析:這個階段操作就相對簡單很多,讀取map的輸出<key,value>,並解析出來。
具體操作:把values中的數字相加即為對應id的PageRank值。
結果如下圖:
程式碼如下
package pageRank;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class pageRank {
public static class Map extends Mapper<Object,Text,IntWritable,FloatWritable>{
private final IntWritable word = new IntWritable();
private String pr;
public void map(Object key,Text value,Context context) throws IOException, InterruptedException{
StringTokenizer itr = new StringTokenizer(value.toString());
if(itr.hasMoreTokens()) {String id = itr.nextToken();}
else return;
pr = itr.nextToken(); //網頁的pr值
int count = itr.countTokens(); //連結ID的數目
float average_pr = Float.parseFloat(pr)/count;
while(itr.hasMoreTokens()){
word.set(Integer.parseInt(itr.nextToken()));
context.write(word, new FloatWritable(average_pr));
}
}
}
public static class Reduce extends Reducer<IntWritable,FloatWritable,IntWritable,FloatWritable>{
float sum;
public void reduce(IntWritable key,Iterable<FloatWritable>values,Context context) throws IOException, InterruptedException{
for(FloatWritable val:values){
sum += val.get();
}
context.write(key,new FloatWritable(sum));
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// TODO Auto-generated method stub
Job job = new Job();
job.setJarByClass(pageRank.class);
job.setNumReduceTasks(1);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(FloatWritable.class);
FileInputFormat.addInputPath(job, new Path("/thinkgamer/input"));
FileOutputFormat.setOutputPath(job, new Path("/thinkgamer/output"));
System.exit(job.waitForCompletion(true)? 0 : 1);
}
}
相關文章
- PageRank演算法概述與Python實現演算法Python
- pangrank演算法--PageRank演算法並行實現演算法並行
- PageRank演算法初探演算法
- 排名演算法(一)--PageRank演算法
- 基於Python實現MapReducePython
- MapReduce原理及簡單實現
- PageRank 演算法-Google 如何給網頁排名演算法Go網頁
- 社群發現之標籤傳播演算法(LPA)python實現演算法Python
- 【大資料】MapReduce開發小實戰大資料
- 尚矽谷大資料Hadoop(30)P120-P127Mapreduce-FileinputFormat實現類KeyValueTextInputFormat案例實現NLineInputFormat案例實現大資料HadoopORM
- 談談Hadoop MapReduce和Spark MR實現HadoopSpark
- 使用IDEA+Maven實現MapReduce的WordCount功能IdeaMaven
- 社群發現演算法 - Fast Unfolding(Louvian)演算法初探演算法AST
- MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解HanLP中文分詞
- 二分搜尋演算法的實現演算法
- Java實現二分查詢演算法Java演算法
- 『NodeParty 開源基金會』 社群激勵計劃,知名專案 PR/原創文章現金獎勵
- 您是否真的需要實現前後端分離的API? -DEV社群後端APIdev
- 從分治演算法到 Hadoop MapReduce演算法Hadoop
- Hadoop(三)通過C#/python實現Hadoop MapReduceHadoopC#Python
- 10大排序演算法——Java實現排序演算法Java
- 大資料 - MapReduce:從原理到實戰的全面指南大資料
- Hanlp分詞例項:Java實現TFIDF演算法HanLP分詞Java演算法
- C++筆記 劃分與排序演算法C++筆記排序演算法
- 實驗7.Vlan劃分實驗
- 湖南大學人工智慧實驗三:分類演算法實驗人工智慧演算法
- 程式設計師必須知道機器學習與資料探勘十大經典演算法:PageRank演算法篇程式設計師機器學習演算法
- Hadoop大資料實戰系列文章之Mapreduce 計算框架Hadoop大資料框架
- 企業大資料平臺MapReduce應用之Join實踐!大資料
- Myers差分演算法的理解、實現、視覺化演算法視覺化
- 差分進化演算法介紹及matlab實現演算法Matlab
- [原始碼解析] PyTorch 流水線並行實現 (2)--如何劃分模型原始碼PyTorch並行模型
- 劃分安全域後 高效、可控的檔案傳輸如何實現?
- 八大排序演算法的python實現排序演算法Python
- C語言實現九大排序演算法C語言排序演算法
- 如何使用大模型實現突破性創新研究?大模型
- 大資料計算的基石——MapReduce大資料
- Hadoop的mapreduce出現問題,報錯The auxService:mapreduce_shuffle does not existHadoopUX
- SOLIDWORKS Simulation實體網格劃分技巧Solid