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 编程模型概述的更多相关文章

  1. mapreduce编程模型你知道多少?

    上次新霸哥给大家介绍了一些hadoop的相关知识,发现大家对hadoop有了一定的了解,但是还有很多的朋友对mapreduce很模糊,下面新霸哥将带你共同学习mapreduce编程模型. mapred ...

  2. MapReduce 编程模型

    一.简单介绍 1.MapReduce 应用广泛的原因之中的一个在于它的易用性.它提供了一个因高度抽象化而变得异常简单的编程模型. 2.从MapReduce 自身的命名特点能够看出,MapReduce ...

  3. MapReduce编程模型详解(基于Windows平台Eclipse)

    本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...

  4. MapReduce编程模型简介和总结

    MapReduce应用广泛的原因之一就是其易用性,提供了一个高度抽象化而变得非常简单的编程模型,它是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,在其编程模型中,任务可以被分解成相互独立的 ...

  5. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

  6. MapReduce编程模型及其在Hadoop上的实现

    转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示:  关于上 ...

  7. 批处理引擎MapReduce编程模型

    批处理引擎MapReduce编程模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce是一个经典的分布式批处理计算引擎,被广泛应用于搜索引擎索引构建,大规模数据处理 ...

  8. CUDA-F-2-1-CUDA编程模型概述2

    Abstract: 本文继续上文介绍CUDA编程模型关于核函数以及错误处理部分 Keywords: CUDA核函数,CUDA错误处理 开篇废话 今天的废话就是人的性格一旦形成,那么就会成为最大的指向标 ...

  9. CUDA-F-2-0-CUDA编程模型概述1

    Abstract: 本文介绍CUDA编程模型的简要结构,包括写一个简单的可执行的CUDA程序,一个正确的CUDA核函数,以及相应的调整设置内存,线程来正确的运行程序. Keywords: CUDA编程 ...

随机推荐

  1. VS code配置docker的shell环境

    今天尝试了下使用docker来做虚拟机,几番折腾后终于搞定可以用了,但是想着每次都要在命令行敲半天也太恶心了,所以就找了一下可视化的管理工具 首先说下,我的docker主机环境是windows10,用 ...

  2. HDU 6182 A Math Problem

    暴力. $k$的$k$次方在$k=15$的时候,达到了最大不爆掉的情况. #include<bits/stdc++.h> using namespace std; long long an ...

  3. Building Robust and Flexible Event System in Unity3D

    Building Robust and Flexible Event System in Unity3D 1. Prerequisites 1.1 Observer Pattern According ...

  4. 表白 代码 韩梦飞沙-画心.html

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 韩梦飞沙-画心.html <!DOCTYPE html> <html& ...

  5. [CODE FESTIVAL 2018]Sushi Restaurant

    题意:有$n$个人,对每个人,他有$p_i$的概率饥饿值为$x_i$($1\leq i\leq m$),你现在要做$n$盘寿司,每盘寿司有一定的数量,当这$n$个人的饥饿值确定后他们会自己选择最优的( ...

  6. NOIP 解题有感

    算法方面: 在搜索问题上,包括贪心等没有固定算法的题目,还有输出格式(包括输入格式)特别容易出错.这也是解题选手的弱点. 1.做搜索题把步骤先用文字写下来,再转换成代码,以避免敲代码时疏漏某个条件. ...

  7. Language Modeling---NLP学习笔记(原创)

    本栏目来源于对Coursera 在线课程 NLP(by Michael Collins)的理解.课程链接为:https://class.coursera.org/nlangp-001 1. 语言模型定 ...

  8. 让你的chrome开发工具console支持jquery

    首先执行以下代码: ;(function(d,s){d.body.appendChild(s=d.createElement('script')).src='http://code.jquery.co ...

  9. bzoj 3052 树上莫队 待修改

    感谢: http://vfleaking.blog.163.com/blog/static/174807634201311011201627/ http://hzwer.com/5250.html 好 ...

  10. [转]如何解决android模拟器慢的问题

    分步阅读 在android开发的过程,发现android模拟器的速度不是一般的慢,那主要是因为android模拟器默认采用的是arm处理器造成的,这里主要提供两种方法: ① 利用intel虚拟硬件加速 ...