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),用户仍然可以使用。

目录
相关文章
|
2月前
|
分布式计算 Java Hadoop
云计算与大数据实验五 MapReduce编程
云计算与大数据实验五 MapReduce编程
63 0
|
8月前
|
分布式计算 算法 Java
MapReduce入门编程-成绩求和排序
MapReduce入门编程-成绩求和排序
MapReduce入门编程-成绩求和排序
|
分布式计算 Python
Python实现一个最简单的MapReduce编程模型WordCount
Python实现一个最简单的MapReduce编程模型WordCount
|
分布式计算 Java 大数据
MapReduce基础编程之按日期统计及按日期排序(下)
MapReduce基础编程之按日期统计及按日期排序(下)
152 0
MapReduce基础编程之按日期统计及按日期排序(下)
|
分布式计算 Java Hadoop
MapReduce基础编程之按日期统计及按日期排序(上)
MapReduce基础编程之按日期统计及按日期排序(上)
154 0
MapReduce基础编程之按日期统计及按日期排序(上)
|
分布式计算
MapReduce编程例子之Combiner与Partitioner
MapReduce编程例子之Combiner与Partitioner
159 0
MapReduce编程例子之Combiner与Partitioner
|
分布式计算 资源调度 并行计算
|
分布式计算 大数据 Java
MapReduce 编程模型 & WordCount 示例(下)
之前在学习大数据的时候,很多东西很零散的做了一些笔记,但是都没有好好去整理它们,这篇文章也是对之前的笔记的整理,或者叫输出吧。一来是加深自己的理解,二来是希望这些东西能帮助想要学习大数据或者说正在学习大数据的朋友。如果你看到里面的东西,让你知道了它,这也是一种进步嘛。说不定就开启了你的另一扇大门呢?
MapReduce 编程模型 & WordCount 示例(下)
|
存储 分布式计算 大数据
MapReduce 编程模型 & WordCount 示例(上)
之前在学习大数据的时候,很多东西很零散的做了一些笔记,但是都没有好好去整理它们,这篇文章也是对之前的笔记的整理,或者叫输出吧。一来是加深自己的理解,二来是希望这些东西能帮助想要学习大数据或者说正在学习大数据的朋友。如果你看到里面的东西,让你知道了它,这也是一种进步嘛。说不定就开启了你的另一扇大门呢?
MapReduce 编程模型 & WordCount 示例(上)
相关产品
云迁移中心
推荐文章
更多