分布式系统(二)——分布式集群计算平台

分布式系统最重要的组成部分就是分布式计算,本文主要介绍了最重要的也是最被广泛应用的分布式计算平台,MapReduce以及PageRank
本文的全部资源来源于清华大学分布式计算课程网站,网站地址为http://thu-cmu.cs.tsinghua.edu.cn/curriculum/dscourse/index.html


MapReduce

MapReduce是一个分布式计算平台,它向用户隐藏了并行、数据分发、容错和负载均衡的相应具体细节,使得用户可以像在单机上编写程序那样编写分布式应用程序。

编程模型

map(in_key,in_value)->(out_key,intermediate_value)list
reduce(in_key,list(intermediate_value))->(out_key,out_value)

mapreduce由map和reduce两个函数组成,map函数接受一个输入,输入的格式为键值对,输出多个符合要求的中间结果键值对,然后经过经过中间一个洗牌阶段,相同key的键值对整合成一个(in_key,list(out))输入,reduce在做这些处理之后,输入一个out的值

wordcount

一个最简单的mapreduce例子就是wordcount,即统计每个单词出现的次数,假设我们的文章很多,因此,我们需要一个分布式计算平台,mapreduce就可以顺利完成这个任务,比如说,由于我们每个map操作和每个reduce操作都是独立的,具体的实现伪代码如下

map(String input_key, String input_value):
  // input_key: document name 
  // input_value: document contents 
  for each word w in input_value: 
    EmitIntermediate(w, "1"); 

reduce(String output_key, Iterator intermediate_values): 
  // output_key: a word 
  // output_values: a list of counts 
  int result = 0; 
  for each v in intermediate_values: 
    result += ParseInt(v);
 Emit(AsString(result));

map函数接受每个一个(文档名,文档内容)的输入,然后对文档中的每一个单词输出一个(单词,“1”)的键值对,这样多个map同时工作,输出无数的中间键值对,经过中间的洗牌阶段,同一个键的所有键值对被整合成了(键,list(值))发送给reduce,reduce把list中的值加起来,最后得到的值就是该单词出现的次数。

PageRank

原理

pageRank是google评判一个网站价值的算法模型,比如网络上数以亿计的网站,我们如何对这些网站做出一个评分,然后根据评分按照顺序展示给用户。

PR(A)=(1d)+(PR(T1)/C(T1)+...+PR(Tn)/C(Tn))

首先我们假设链接T1…Tn中都有链接指向网站A
PR:网站(链接)的平台
C(T):网站T的出度,即网站T有多少个指向其他网站的链接
d:一个常数因子

那么,一个网站的平台可以由所有指向它的其他网站的评分除以网站的出度的和,即如果几个重要的网站(评分比较高)指向该网站,那么这个网站的评分也应该比较高。

mapReduce实现

我们可以看到计算过程相对比较复杂,尤其在有原始数据的时候,我们只能给所有网站一个原始的评分,然后我们一步步的重复执行这个算法,直到所有数据收敛,因此,我们可以把这个任务交由mapReduce去做。
具体的伪代码实现如下

parse(URL,pageContent):
  //URL:我们读取的网址的URL
  //pageContent:网址的内容
  emit(URL,(PRinit,URLlist))

map(URL,(PR,URLlist)):
  //PR:该URL的评分
  //URLlist:该URL指向的所有链接的集合
  for each URL in URLlist:
     emit(URL,PR/|URLlist|)
  //这里把map的输入再次提交的原因在于,我们要在整个过程中保存URL指向的URL集合
  emit(URL,URLlist)

reduce(URL,URLlist&&URL,list(prs)):
   //reduce接受两类输入,一个是值是指向链接的集合,一个是评分的集合
   pr=PR(LIST(prs))  //按照pageRank的算法计算应该有的pr值
   emit(URL,(pr,URLlist))

我们可以看到reduce的输出和map的输入是同一个格式,因此我们可以递归的执行这个操作,可以设置相应的终止条件来终止这样一个循环。

你可能感兴趣的:(分布式系统)