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后的编程模型。