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),用户仍然可以使用。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Hadoop 基本架构
HDFS 架构 HDFS 是一个具有高度容错性的分布式文件系统, 适合部署在廉价的机器上。 HDFS 能提供高吞吐量的数据访问, 非常适合大规模数据集上的应用。HDFS 的架构如图所示, 总体上采用了 master/slave 架构, 主要由以下几个组件组成 :Client、 NameNode、 Secondary NameNode 和 DataNode。 下面分别对这几个组件进行介绍: (1) ClientClient(代表用 户) 通过与 NameNode 和 DataNode 交互访问 HDFS 中 的文件。 Client提供了一个类似 POSIX 的文件系统接口供用户调用。 (2) NameNode 整个Hadoop 集群中只有一个 NameNode。 它是整个系统的“ 总管”, 负责管理 HDFS的目录树和相关的文件元数据信息。 这些信息是以“ fsimage”( HDFS 元数据镜像文件)和“ editlog”(HDFS 文件改动日志)两个文件形式存放在本地磁盘,当 HDFS 重启时重新构造出来的。此外, NameNode 还负责监控各个 DataNode 的健康状态, 一...
- 下一篇
MapReduce API 基本概念
1.序列化 序列化是指将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。反序列化指的是将字节流转为结构化对象的过程。 在 Hadoop MapReduce 中, 序列化的主 要 作用有两个: 永久存储和进程间通信。为了能够读取或者存储 Java 对象, MapReduce 编程模型要求用户输入和输出数据中的 key 和 value 必须是可序列化的。 在 Hadoop MapReduce 中 , 使一个 Java 对象可序列化的方法是让其对应的类实现 Writable 接口 。 但对于 key 而言,由于它是数据排序的关键字, 因此还需要提供比较两个 key 对象的方法。 为此,key对应类需实现WritableComparable 接口 , 它的类如图: 在package org.apache.hadoop.io 中的WritableComparable.java文件中定义: public interface WritableComparable<T> extends Writable, Comparable<T> { } 再来看看Writab...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Mario游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果