HaLoop:大集群上高效的迭代数据处理(下)

来源:互联网 发布:淘宝充值刷信誉有用吗 编辑:程序博客网 时间:2024/06/06 03:35

紧接:HaLoop:大集群上高效的迭代数据处理(上)

  本文详细了介绍三种在HaLoop上实现的迭代算法:PageRank,Descendant Query,K-means聚类。

9.2 PageRank实现

  让我们来过一遍PageRank(Example 1)是如何在HaLoop上面实现的。图17展示了其伪代码的实现。在PageRank循环体中有两步:一个是连接Ri和L并填补rank;另一个是在每个URL上合并rank。每一步都是一个map-reduce对。每一对都是通过调用HaLoop的AddMap和AddReduce函数来增加到整个迭代程序。连接步骤由两个用户定义的函数组成,Map_Rank和Reduce_Rank。在第一次迭代时,Map_Rank从链接表L或初始rank表R0读取输入元组。函数的输出是作为key(L.url_src或R0.url)的连接列,剩下的输入元组作为value。为区分来源,给每个输出元组附上了表ID。在图17中,#1是L的表ID,#2是rank表Ri的ID。在之后的迭代过程中,Map_Rank从Ri中简单地读取元组,把url列作为key,把rank列作为value,并跟之前一样附上表ID。
  在每个迭代过程中,Reduce_Rank对目标URLs计算局部的rank(在invariantValues中),其中每个目标URL除以目标URL的数量后分配给源URL的rank。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
  Aggregation步骤包括Map_Aggregate和Reduce_Aggregate,其中Map_Aggregete读取由Reduce_Rank产生的原始ranks,Reduce_Aggregate把每个URL的局部ranks求和。
  连续迭代的Reducer输出之间的距离衡量是简单的rank差别(ResultDistance和line 6 in Main)。表L被设置成循环不变的(Map_Rank and line 7 in Main)。IterationInput和line 8 in Main指定每个迭代的输入:第一次迭代是{L,R0},之后的第i次迭代是{Ri-1}。因此,在Reduce_Rank中,通过从缓存的L分区查询key(Reduce_Rank)并在url_dest列上进行投影来获得invariantValues。fixedPointThreshold设置成0.1,maxNumofIterations设置成10(line 9-10 in Main)。Lines 11-12 in Main 开启reducer输入缓存来改善连接的性能,开启reducer输出缓存来支持分布式fixpoint评估。最后,作业会被提交到HaLoop master结点上(line 13 in Main)。

9.3 Descendant Query Implementation

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
  在图18中我们呈现了Example 2(descendant query)的HaLoop伪代码实现。与PageRank相似,循环体有两步:一个是连接(通过跳一步找出朋友的朋友),另一个是去重(移除被扩展的朋友集中重复的朋友)。我们仍然利用reducer输入缓存(line 11 in Main),并设置F为循环不变(line 1-2 in Map_Join和line 8 in Main)。Map_Join和Reduce_Join形成了连接步骤。在第一次迭代时,Map_Join读取F和ΔS0的输入元组,输出连接的列作为key,剩下的列和表ID作为value。在这个例子中,#1是朋友表F的ID,#2为ΔSi1的ID。在之后迭代i中,Map_Join简单地读取ΔSi1元组并附上表ID作为输出。对于每个key(ΔSi1.name2),Reduce_Join计算相应的values的笛卡尔积(ΔSi1.name1)和invariantValues(F.name2)。去重步骤包括Map_Distinct和Reduce_Distinct。Map_Distinct发出元组,列name1为key,列name2为value,Reduce_Distinct输出不同的<key,value>(<ΔSi.name1, ΔSi.name2>)对。Main中Line 7的IterationInput指定每个迭代的输入:第一次迭代为{F, ∆S0},之后的迭代i为{ΔSi1}。ResultDistance函数简单地返回当前out_key对应的out_value集vi的大小。fixedPointThreshold设置成1(line 9 in Main)。maxNumOfIteration设置成2。因此,循环终止条件要么是ΔSi为空要么到达两次迭代。由于fixpoint评估没有比较两次迭代的结果,我们关闭reducer输出缓存选项。Main中的其它部分与图17对应的部分相似。

9.4 k-means实现

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
  K-means聚类是另一种常见的迭代数据分析算法,它可以在HaLoop上实现。不像之前两个例子,k-means利用了mapper输入缓存而不是reducer输入缓存,因为每次迭代的mapper输入数据是不变的,而reducer输入数据是会改变的。而且,由于每次迭代的输出非常小,没有必要开启reducer输出缓存。
  我们在图19呈现了该应用的代码。程序里只有一个map-reduce步骤:Map_Kmeans和Reduce_Kmeans。Map_Kmeans分配一个输入元组给最近的簇(基于元组和每个簇均值的距离),输出簇ID作为key,元组作为value,Reduce_Kmeans计算所有同一个簇的元组的均值。我们只输出簇均值作为每次迭代的结果。循环执行完后,需要有一个额外的MapReduce作业决定和输出每个元组的簇成员关系。简单起见,我们这里忽略这个额外的作业。IterationInput返回一个常量(HDFS路径上的数据集)。在mapper函数Map_Kmeans调用之前,每个mapper也通过mapper hook函数Map_Kmeans_Configure从HDFS加载最近的簇均值。ResultDistance衡量来自不同迭代但簇ID相同的两个簇的差异度。两个簇均值的距离衡量采用Manhattan距离。FixedPointThreshold设置成0.01(line 5 in Main),maxNumOfIteration在下一行设置成12。在line 8 in Main中开启了mapper输入缓存。

原创粉丝点击