MapReduce编程模型概述

从MapReduce自身的命名特点可以看出,MapReduce由两个阶段组成:Map和Reduce。用户只需编写map()和reduce()两个函数,即可完成简单的分布式程序的设计。

map()函数以key/value对作为输入,产生另外一系列key/value对作为中间输出写入本地磁盘。MapReduce框架会自动将这些中间数据按照key值进行聚集,且key值相同(用户可设定聚集策略,默认情况下是对key值进行哈希取模)的数据被统一交给reduce()函数处理。

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

下面以MapReduce中的“hello world”程序—WordCount为例介绍程序设计方法。

“hello world”程序是我们学习任何一门编程语言编写的第一个程序。它简单且易于理解,能够帮助读者快速入门。同样,分布式处理框架也有自己的“hello world”程序:WordCount。它完成的功能是统计输入文件中的每个单词出现的次数。在MapReduce中,可以这样编写(伪代码)。

其中Map部分如下:

// key:字符串偏移量  
// value:一行字符串内容  
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)); 

用户编写完MapReduce程序后,按照一定的规则指定程序的输入和输出目录,并提交到Hadoop集群中。作业在Hadoop中的执行过程如图2-2所示。Hadoop将输入数据切分成若干个输入分片(input split,后面简称split),并将每个split交给一个Map Task处理;Map Task不断地从对应的split中解析出一个个key/value,并调用map()函数处理,处理完之后根据Reduce Task个数将结果分成若干个分片(partition)写到本地磁盘;同时,每个Reduce Task从每个Map Task上读取属于自己的那个partition,然后使用基于排序的方法将key相同的数据聚集在一起,调用reduce()函数处理,并将结果输出到文件中。

细心的读者可能注意到,上面的程序还缺少三个基本的组件,功能分别是:①指定输入文件格式。将输入数据切分成若干个split,且将每个split中的数据解析成一个个map()函数要求的key/value对。②确定map()函数产生的每个key/value对发给哪个Reduce Task函数处理。③指定输出文件格式,即每个key/value对以何种形式保存到输出文件中。

在Hadoop MapReduce中,这三个组件分别是InputFormat、Partitioner和OutputFormat,它们均需要用户根据自己的应用需求配置。而对于上面的WordCount例子,默认情况下Hadoop采用的默认实现正好可以满足要求,因而不必再提供。

综上所述,Hadoop MapReduce对外提供了5个可编程组件,分别是InputFormat、Mapper、Partitioner、Reducer和OutputFormat。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值