Hadoop MapReduce并行编程框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014470581/article/details/51480620

Hadoop MapReduce 是Google MapReduce的一个开源实现。

1、MapReduce并行编程抽象模型

① 面向大规模数据处理,MapReduce 采用了对数据“分而治之”的方法来完成并行化的大数据处理。

MapReduce在总结了典型的顺序式大数据处理过程和特征的基础上,提供了一个抽象模型,并借助与函数式设计语言Lisp的设计思想,用Map和Reduce函数提供了两个层次的并行编程抽象模型和接口,程序员只要实现者两个基本接口即可快速完成并行化程序的设计。

②MapReduce定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:

  map: (k1,v1)--->[k2,v2]

其中,输入参数:键值对(k1;v1)表示的数据。响应的处理逻辑是: 一个数据记录(如文本文件中的一行,或数据表格中的一行)将以“键值对”的形式传入map函数;map函数将处理这些键值对,并以另一种键值对形式输出一组对表示的中间结果【(k2,v2)】。

③reduce:  (k2;[v2]) --->[(k3;v3)]

其中,输入参数是由map函数输出的一组中间结果键值对(k2;【v2】),所以传入reduce函数时会将具有相同主键k2下的所有值v2合并到一个集合处理。相应的处理逻辑是:对map输出的这组中间结果键值对,将进一步进行某种整理计算,最终输出为某种形式的结果键值对 【(k3;v3)】

经过上述②③ 的Map和Reduce的抽象后,MapReduce将演化为如下并行计算模型:


并行编程的基本处理过程如下:

   1)各个Map节点对所划分的数据进行并行处理,从不同的输入数据产生的相应的中间结果输出

   2)各个Reduce节点也各自进行并行计算,各自负责处理不同的中间结果数据集合。

3)进行Reduce处理之前,必须等到所有的Map节点处理完,因此,在进入Reduce前需要有一个同步障(barrier);这个阶段也负责对Map的中间结果数据进行收集整理(Aggregation & Shuffle)处理,以便Reduce节点可以完全基于本节点上的数据计算最终结果。

4)汇总所有Reduce的输出结果即可获得最终结果。


④Combiner

对于(text3,“good weather is good”),输出: (good,1),(weather,1),(is,1),(good,1).    有两个(good, 1)键值对,而将这两个相同的主键的键值对直接传输给Reduce,显然会增加不必要的网络数据传输,如果处理的是巨量的键值对直接传输给Reduce ,显然会增加不必要的网络数据传输。

把2个(good ,1)合并成(good,2),以此大大减少需要传输的中间结果数据量,达到网络数据传输优化

     为了完成这种中间结果数据传输的优化,MapReduce框架提供了一个称之为Combiner的对象专门负责处理这个事情,其主要作用就是进行中间结果数据网络传输的优化工作。Combiner程序的执行实在Map节点完成计算后,输出中间结果之前。

⑤Partitioner

为了保证所有的主键相同的键值对传输给同一个Reduce节点,以便Reduce节点能在不需要访问其他Reduce节点的情况下,一次性顺利统计出所有的词频,我们需要对即将传入Reduce节点的中间结果键值对进行恰当的分区处理(Partitioning)。

MapReduce专门提供了一个Partitoner类来完成这个工作,主要目的就是消除数据传入Reduce节点后带来不必要的相关性。

这个分区的过程是在Map节点到Reduce节点中间的数据整理阶段完成的,具体来书,是在Map节点输出后,传入Reduce节点之前完成的。

加入Combiner和Partitioner后的编程模型。



展开阅读全文

没有更多推荐了,返回首页