MapReduce 编程模型概述
MapReduce 编程模型给出了其分布式编程方法,共分 5 个步骤:
1) 迭代(iteration)。遍历输入数据, 并将之解析成 key/value 对。
2) 将输入 key/value 对映射(map) 成另外一些 key/value 对。
3) 依据 key 对中间数据进行分组(grouping)。
4) 以组为单位对数据进行归约(reduce)。
5) 迭代。 将最终产生的 key/value 对保存到输出文件中。
MapReduce 将计算过程分解成以上 5 个步骤带来的最大好处是组件化与并行化。为了实现 MapReduce 编程模型, Hadoop 设计了一系列对外编程接口 。用户可通过实现这些接口完成应用程序的开发。
MapReduce 编程接口体系结构
MapReduce 编程模型对外提供的编程接口体系结构如图所示,整个编程模型位于应用程序层和 MapReduce 执行器之间,可以分为两层。第一层是最基本的 Java API,主要有 5个可编程组件,分别是 InputFormat、Mapper、Partitioner、Reducer 和 OutputFormat 。Hadoop 自带了很多直接可用的 InputFormat、Partitioner 和 OutputFormat,大部分情况下,用户只需编写 Mapper 和 Reducer 即可。 第二层是工具层,位于基本 Java API 之上,主要是为了方便用户编写复杂的 MapReduce 程序和利用其他编程语言增加 MapReduce 计算平台的兼容性而提出来的。在该层中,主要提供了 4 个编程工具包:
❑ JobControl:方便用户编写有依赖关系的作业, 这些作业往往构成一个有向图, 所以通常称为 DAG( Directed Acyclic Graph) 作业。
❑ ChainReducer:方便用户编写链式作业, 即在 Map 或者 Reduce 阶段存在多个 Mapper,形式如下:[MAPPER+ REDUCER MAPPER*]
❑ Hadoop Streaming:方便用户采用非 Java 语言编写作业,允许用户指定可执行文件或者脚本作为 Mapper/Reducer。
❑ Hadoop Pipes:专门为 C/C++ 程序员编写 MapReduce 程序提供的工具包。
新旧 MapReduce API 比较
从 0.20.0 版本开始, Hadoop 同 时提供了 新旧 两套 MapReduce API。 新 API 在旧 API基础上进行了封装, 使得其在扩展性和易用性方面更好。 新旧版 MapReduce API 的主要区别如下。
(1)存放位置
旧版 API 放在 org.apache.hadoop.mapred 包中, 而新版 API 则放在 org.apache.hadoop.mapreduce 包及其子包中。
(2)接口变为抽象类
接口通常作为一种严格的“协议约束”。 它只有方法声明而没有方法实现,且要求所有实现类(不包括抽象类)必须实现接口中的每一个方法。接口的最大优点是允许一个类实现多个接口,进而实现类似 C++ 中的“多重继承”。抽象类则是一种较宽松的“约束协议”,它可为某些方法提供默认实现。 而继承类则可选择是否重新实现这些方法。正是因为这一点,抽象类在类衍化方面更有优势,也就是说,抽象类具有良好的向后兼容性,当需要为抽象类添加新的方法时,只要新添加的方法提供了默认实现, 用户之前的代码就不必修改了。
考虑到抽象类在API衍化方面的优势, 新 API 将 InputFormat、 OutputFormat、Mapper、 Reducer 和 Partitioner 由接口变为抽象类。
(3)上下文封装
新版 API 将变量和函数封装成各种上下文(Context)类,使得 API 具有更好的易用性和扩展性。 首先,函数参数列表经封装后变短, 使得函数更容易使用;其次,当需要修改或添加某些变量或函数时,只需修改封装后的上下文类即可,用户代码无须修改,这样保证了向后兼容性,具有良好的扩展性。图展示了新版 API 中树形的 Context 类继承关系。这些 Context 各自封装了一种实体的基本信息及对应的操作(setter 和 getter 函数),如 JobContext、TaskAttemptContext 分别封装了 Job 和 Task 的基本信息,TaskInputOutputContext 封装了Task 的各种输入输出 操作,MapContext 和 ReduceContext 分别封装了 Mapper 和 Reducer 对外的公共接口 。
除了以上三点不同之外,新旧 API 在很多其他细节方面也存在小的差别,具体将在接下来的内容中讲解。
由于新版和旧版 API 在类层次结构、编程接口名称及对应的参数列表等方面存在较大差别, 所以两种 API 不能兼容。但考虑到应用程序的向后兼容性,短时间内不会将旧 API
从 MapReduce 中去掉。即使在完全采用新 API 的 0.21.0/0.22.X 版本系列中,也仅仅将旧API 标注为过期(deprecated),用户仍然可以使用。
参考资料
《Hadoop技术内幕 深入理解MapReduce架构设计与实现原理》
MapReduce 编程模型概述的更多相关文章
- mapreduce编程模型你知道多少?
上次新霸哥给大家介绍了一些hadoop的相关知识,发现大家对hadoop有了一定的了解,但是还有很多的朋友对mapreduce很模糊,下面新霸哥将带你共同学习mapreduce编程模型. mapred ...
- MapReduce 编程模型
一.简单介绍 1.MapReduce 应用广泛的原因之中的一个在于它的易用性.它提供了一个因高度抽象化而变得异常简单的编程模型. 2.从MapReduce 自身的命名特点能够看出,MapReduce ...
- MapReduce编程模型详解(基于Windows平台Eclipse)
本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...
- MapReduce编程模型简介和总结
MapReduce应用广泛的原因之一就是其易用性,提供了一个高度抽象化而变得非常简单的编程模型,它是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,在其编程模型中,任务可以被分解成相互独立的 ...
- [转]Hadoop集群_WordCount运行详解--MapReduce编程模型
Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...
- MapReduce编程模型及其在Hadoop上的实现
转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示: 关于上 ...
- 批处理引擎MapReduce编程模型
批处理引擎MapReduce编程模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce是一个经典的分布式批处理计算引擎,被广泛应用于搜索引擎索引构建,大规模数据处理 ...
- CUDA-F-2-1-CUDA编程模型概述2
Abstract: 本文继续上文介绍CUDA编程模型关于核函数以及错误处理部分 Keywords: CUDA核函数,CUDA错误处理 开篇废话 今天的废话就是人的性格一旦形成,那么就会成为最大的指向标 ...
- CUDA-F-2-0-CUDA编程模型概述1
Abstract: 本文介绍CUDA编程模型的简要结构,包括写一个简单的可执行的CUDA程序,一个正确的CUDA核函数,以及相应的调整设置内存,线程来正确的运行程序. Keywords: CUDA编程 ...
随机推荐
- ftp缓存信息
using System.Collections.Generic; using NewTempo.Ftp; using System.IO; using NshowAdClient.NshowAdSe ...
- 洛谷P2571 [SCOI2010]传送带 [三分]
题目传送门 传送带 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移 ...
- redis优化方案
流水线(pipelined) 批量提交redis命令,减少通信次数 事务 mulit,事务的开始 exec,执行事务快内的命令 discard,放弃事务快内的命令 watch,监视key,如果key改 ...
- springMVC
SpringMVC架构流程: 1.用户发送请求至前端控制器DispatcherServlet2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.3.处理器映射器 ...
- Tornado(一)
Tornado 特点 Tornado是一个用Python写的相对简单的.不设障碍的Web服务器架构,用以处理上万的同时的连接口,让实时的Web服务通畅起来.虽然跟现在的一些用Python写的Web架构 ...
- FastReport.Net使用:[35]奇偶行
文本控件类型的奇偶行数据实现(普通) 1.普通的奇偶行数据主要使用报表对象的EvenStyle(偶数行样式)属性实现. 首先通过 报表-->样式 菜单打开样式编辑器,编辑几个备用样式. 样式的编 ...
- java8新特性——Stream API
Java8中有两大最为重要得改变,其一时Lambda表达式,另外就是 Stream API了.在前面几篇中简单学习了Lambda表达式得语法,以及函数式接口.本文就来简单学习一下Stream API( ...
- BZOJ1935 园丁的烦恼
一个二维偏序的问题,学过了三维偏序cdq分治之后觉得这个题非常的水.只需按一维排序之后再用树状数组操作即可.——by VANE #include<bits/stdc++.h> using ...
- WEB架构师成长之路 二
法宝一:牛人爱惜自己的时间. 时间就是金钱,时间就是生命,时间如同健康一样,如果时间都没有,那成功也就是浮云了.所以牛人总是很爱惜自己的时间,总是在想办法提高自己的做事效率.我突然想了起来,我QQ里有 ...
- arraylist-lambada-性能测试
package cn.com.one;import java.util.ArrayList;public class ttt { public static void main(String [] a ...