MapReduce编程模型简介

MapReduce由两个阶段组成:Map和Reduce,用户只需要编写map()和reduce()两个函数,即可完成简单的分布式程序的设计。

map()函数以key/value对作为输入,产生另外一系列key/value对作为中间输出写入本地磁盘。MapReduce框架会自动将这些中间数据按照key值进行聚集,且key值相同的数据被统一交给reduce()函数处理。

reduce()函数以key及对应的value列表作为输入,经合并key相同的value值后,产生另外一系列key/value对作为最终输出写入HDFS。

MapReduce中,WordCount伪代码如下:

Map部分如下:

map(String key, String value):

    //将字符串分割为单词

    words = SplitIntoTokens(value);

    for each word w in words:

        EmitIntermediate(w,"1");

Reduce部分如下:

//key:一个单词

//values:该单词出现的次数列表

reduce(String key, Iterator values):

    int result = 0;

    for each v in values:

        result += StringToInt(v);

    Emit(key, IntToString(result));

 

Hadoop将输入数据切分成若干个输入分片(input split),并将每个split交给一个Map Task处理;

Map Task不断地从对应的split中解析出一个个key/value,并调用map()函数处理,处理完之后根据Reduce Task个数将结果分成若干个分片(partition)写到本地磁盘;

同时,每个Reduce Task从每个Map Task上读取属于自己的那个partition,然后使用基于排序的方法将key相同的数据聚集在一起,调用reduce()函数处理,并将结果输出到文件中。

上面的程序还缺少三个基本的组件,功能分别是:

(1)指定输入文件格式。将输入数据切分成若干个split,且将每个split中的数据解析成一个个map()函数要求的key/value对。

(2)确定map()函数产生的每个key/value对发给哪个Reduce Task函数处理。

(3)指定输出文件格式,即每个key/value对以何种形式保存到输出文件中。

 Hadoop MapReduce对外提供了5个可编程组件,分别是InputFormat、Mapper、Partitioner、Reducer和OutputFormat。

 

MapReduce能解决的问题有一个共同点:任务可以被分解为多个子问题,且这些子问题相对独立,彼此之间不会有牵制,待并行处理完这些子问题后,任务便被解决。

posted @ 2020-10-10 20:16  飞舞的小蛇  阅读(689)  评论(0)    收藏  举报