MapReduce


什么是MapReduce ?

MapReduce是一种计算模型,简单的说就是将大批量的任务分解(Map)执行,然后再将分解执行的结果合并(Reduce)成最终结果。这样做的好处是任务在被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。


Mapping Lists(分解数据列表)

MapReduce程序的第一步叫做mapping,在这一步会有一些数据元素作为Mapper函数的输入数据,每次一个,

Mapper会把每次map得到的结果单独的传到一个输出数据元素里。

  




Reducing Lists(合并数据列表)


Reducing可以把数据聚集在一起。reducer函数接收来自输入列表的迭代器,它会把这些数据聚合在一起,然后返回一个输出值。

Reducing一般用来生成”总结“数据,把大规模的数据转变成更小的总结数据。

比如,"+"可以用来作一个reducing函数,去返回输入数据列表的值的总和。


举例:


Map-Reduce框架的运作完全基于<key,value>对,即数据的输入是一批<key,value>对,生成的结果也是一批<key,value>对,只是有时候它们的类型不一样而已。


一个Map-Reduce任务的执行过程以及数据输入输出的类型如下所示:

(input)<k1,v1> -> map -> <k2,v2> -> combine -> <k2,v2> -> reduce -> <k3,v3>(output)


下面通过一个的例子来详细说明这个过程
1 WordCount(词频统计)示例

这也是Hadoop自带的一个例子,目标是统计文本文件中单词的个数。

假设有如下的两个文本文件来运行WorkCount程序:

Hello World Bye World  

Hello Hadoop GoodBye Hadoop


2 map数据输入

Hadoop针对文本文件缺省使用LineRecordReader类来实现读取,一行一个key/value对,key取偏移量,value为行内容。

下表是map1的输入数据:

Key1 Value1
0 Hello World Bye World

下表是map2的输入数据:

Key1 Value1
0 Hello Hadoop GoodBye Hadoop


3 map输出/combine输入

下表是map1的输出结果

Key2 Value2
Hello 1
World 1
Bye 1
World 1

下表是map2的输出结果

Key2 Value2
Hello 1
Hadoop 1
GoodBye 1
Hadoop 1


4 combine输出

combiner类实现将相同key的值合并起来,它也是一个Reducer的实现。

下表是combine1的输出

Key2 Value2
Hello 1
World 2
Bye 1

下表是combine2的输出

Key2 Value2
Hello 1
Hadoop 2
GoodBye 1


5 reduce输出

Reducer类实现将相同key的值合并起来。

下表是reduce的输出

Key2 Value2
Hello 2
World 2
Bye 1
Hadoop 2
GoodBye 1

即实现了WordCount(词频统计)的处理。



下图是用MapReduce实现(WordCount)词频统计的流程图:

003900rhr4g1trt77mt4bd

相关内容