MapReduce编程模型.ppt
- 文档编号:1398435
- 上传时间:2022-10-22
- 格式:PPT
- 页数:37
- 大小:2.32MB
MapReduce编程模型.ppt
《MapReduce编程模型.ppt》由会员分享,可在线阅读,更多相关《MapReduce编程模型.ppt(37页珍藏版)》请在冰豆网上搜索。
MapReduce编程模型,概述,MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式框架,其适用应用场景的共同特点是:
任务可被分解为相互独立的子问题。
基于该特点,MapReduce编程模型给出了其分布式编程方法,共分5个步骤:
迭代(iteration)。
遍历输入数据,并将之解析成key/value对。
将输入的key/value对映射(map)成另外一些key/value对。
依据key对中间数据进行分组(group)。
以组为单位对数据进行规约(reduce)。
迭代。
将最终产生的key/value对保存到输出文件。
好处:
组件化和并行化。
MapReduce编程接口体系结构,整个编程模型位于应用程序层和MapReduce执行器之间,可以分为两层。
第一层是最基本的JavaAPI,主要有5个可编程组件,分别是InputFormat、Mapper、Partitioner、Reducer和OutputFormat。
Hadoop自带了很多直接可用的InputFormat、Partitioner和OutputFormat,大部分情况下,用户只需编写Mapper和Reducer即可。
第二层是工具层,位于基本JavaAPI之上,主要是为了方便用户编写复杂的MapReduce程序和利用其他编程语言增加MapReduce计算平台的兼容性而提出来的。
新旧MapReduceAPI比较,从0.20.0版本开始,Hadoop同时提供了新旧两套MapReduceAPI。
新API在旧API基础上进行封装,使其在扩展性和易用性方面更好。
二者区别如下:
存放位置-旧API放在org.apache.Hadoop.mapred包中;-新API放在org.apache.Hadoop.mapreduce包及其子包中。
接口变为抽象类-接口,严格的“协议约束”,只有方法声明而没有方法实,要求所有实现类(抽象类除外)必须实现接口中的每个方法。
-抽象类,较宽松的“约束协议”,可为某些方法提供默认实现,而继承类则可选择是否重新实现这些方法。
故而抽象类在类衍化方面更有优势,即具有良好的向后兼容性。
上下文封装-新版API将变量和函数封装成各种上下文(Context)类,使得API具有更好的易用性和扩展性。
MapReduceAPI基本概念,序列化序列化是指将结构化对象转化为字节流以便于通过网络进行传输或写入持久存储的过程。
在HadoopMapReduce中,序列化的主要作用是永久存储和进程间通信。
为能够读取或者存储Java对象,MapReduce编程模型要求用户输入和输出数据中的key和value必须是可序列化的。
使一个Java对象可序列化的方法是让其对应的实现Writable接口。
而作为数据排序的关键字key所对应的类需要实现WritableComparable接口。
MapReduceAPI基本概念,Reporter参数Reporter是MapReduce提供给应用程序的工具。
如图3-4所示,应用程序可使用Reporter中的方法报告完成进度(progress)、设定状态消息(setStatus)以及更新计数器(incrCounter)。
Reporter是一个基础参数。
MapReduce对外提供的大部分组件,包括InputFormat、Mapper和Reducer等,均在其主要方法中添加了该参数。
MapReduceAPI基本概念,回调机制回调机制是一种常见的设计模式。
它将工作流内的某个功能按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
HadoopMapReduce对外提供的5个组件(InputFormat、Mapper、Partitioner、Reducer和OutputFormat)实际上全部属于回调接口。
当用户按照约定实现这几个接口后,MapReduce运行时环境会自动调用它们。
MapReduceAPI基本概念,回调机制如图3-5所示,MapReduce给用户暴露了接口Mapper,当用户按照自己的应用程序逻辑实现自己的MyMapper后,HadoopMapReduce运行时环境会将输入数据解析成key/value对,并调用map()函数迭代处理。
JavaAPI解析,作业配置与提交InputFormat接口的设计与实现OutputFormat接口的设计与实现Mapper与Reducer的解析Partitioner接口的设计与实现,作业配置与提交,Hadoop配置文件介绍在Hadoop中,Common、HDFS和MapReduce各有对应的配置文件,用于保存对应模块中可配置的参数。
系统默认配置文件分别是core-default.xml、hdfs-default.xml和mapred-default.xml,它们包含了所有可配置属性的默认值。
而管理员自定义配置文件分别是core-site.xml、hdfs-site.xml和mapred-site.xml。
它们由管理员设置,主要用于定义一些新的配置属性或者覆盖系统默认配置文件中的默认值。
通常这些配置一旦确定,便不能被修改(如果想修改,需重新启动Hadoop)。
需要注意的是,core-default.xml和core-site.xml属于公共基础库的配置文件,默认情况下,Hadoop总会优先加载它们。
在Hadoop中,每个配置属性主要包括三个配置参数:
name、value和description,分别表示属性名、属性值和属性描述。
Hadoop为配置文件添加了两个新的特性:
final参数和变量扩展。
作业配置与提交,MapReduce作业配置与提交在MapReduce中,每个作业由两部分组成:
应用程序和作业配置。
其中,作业配置内容包括环境配置和用户自定义配置两部分。
环境配置由Hadoop自动添加,主要由mapred-default.xml和mapred-site.xml两个文件中的配置选项组合而成;用户自定义配置则由用户自己根据作业特点个性化定制而成,比如用户可设置作业名称,以及Mapper/Reducer、ReduceTask个数等。
作业配置与提交,MapReduce作业配置与提交新版API用Job类代替了JobConf和JobClient两个类,这样,仅使用一个类的同时可完成作业配置和作业提交相关功能,进一步简化了作业编写方式。
作业配置与提交,旧API中的作业配置MapReduce配置模块代码结构如图3-6所示。
其中,org.apache.hadoop.conf中的Configuration类是配置模块最底层的类。
从图3-6中可以看出,该类支持以下两种基本操作。
序列化:
序列化是将结构化数据转换成字节流,以便于传输或存储。
Java实现了自己的一套序列化框架。
凡是需要支持序列化的类,均需要实现Writable接口。
迭代:
为了方便遍历所有属性,它实现了Java开发包中的Iterator接口。
作业配置与提交,旧API中的作业配置Configuration类总会依次加载core-default.xml和core-site.xml两个基础配置文件。
JobConf类描述了一个MapReduce作业运行时需要的所有信息,而MapReduce运行时环境正是根据JobConf提供的信息运行作业的。
JobConf继承了Configuration类,并添加了一些设置/获取作业属性的setter/getter函数,以方便用户编写MapReduce程序。
默认情况下,JobConf会自动加载配置文件mapred-default.xml和mapred-site.xml,作业配置与提交,新API中的作业配置与新API中的作业配置相关的类是Job,该类同时具有作业配置和作业提交的功能。
作业配置部分的类图如图3-7所示。
Job类继承了一个新类JobContext,而Context自身则包含一个JobConf类型的成员。
注意,JobContext类仅提供了一些getter方法,而Job类中则提供了一些setter方法。
InputFormat接口的设计与实现,InputFormat主要用于描述输入数据的格式,它提供以下两个功能。
数据切分:
按照某个策略将输入数据切分成若干个split,以便确定MapTask个数以及对应的split。
为Mapper提供输入数据:
给定某个split,能将其解析成一个个key/value对。
InputFormat接口的设计与实现,旧版API的InputFormat解析如图3-8所示,在旧API中InputFormat是一个接口,包含两种方法。
getSplits方法主要完成数据切分的功能,它会尝试着将输入数据切分成numSplits个InputSplit。
getRecordReader方法返回一个RecordReader对象,该对象可将输入的InputSplit解析成若干个key/value对。
MapReduce框架在MapTask执行过程中,会不断调用RecordReader对象中的方法,迭代获取key/value对并交给map()函数处理。
InputFormat接口的设计与实现,InputFormat的实现所有基于文件的InputFormat实现的基类是FileInputFormat,它最重要的功能是为各种InputFormat提供统一的getSplits函数。
该函数实现中最核心的两个算法是文件切分算法和host选择算法。
(1)文件切分算法文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段。
FileInputFormat以文件为单位切分生成InputSplit。
对于每个文件,由以下三个属性值确定其对应的InputSplit的个数。
goalSize:
它是根据用户期望的InputSplit数目计算出来的,即totalSize/numSplits。
其中,totalSize为文件总大小;numSplits为用户设定的MapTask个数,默认情况下是1。
minSize:
InputSplit的最小值,由配置参数mapred.min.split.size确定,默认是1。
blockSize:
文件在HDFS中存储的block大小,不同文件可能不同,默认是64MB。
三个参数共同决定InputSplit的最终大小,计算方法:
splitSize=maxminSize,mingoalSize,blockSize,InputFormat接口的设计与实现,
(2)host选择算法待InputSplit切分方案确定后,下一步要确定每个InputSplit的元数据信息。
这通常由四部分组成:
,分别表示InputSplit所在的文件、起始位置、长度以及所在的host(节点)列表。
其中,前三项很容易确定,难点在于host列表的选择方法。
InputSplit的host列表选择策略直接影响到运行过程中的任务本地性。
HDFS上的文件是以block为单位组织的,一个大文件对应的block可能遍布整个Hadoop集群,而InputSplit的划分算法可能导致一个InputSplit对应多个block,这些block可能位于不同节点上,这使得Hadoop不可能实现完全的数据本地性。
InputSplit对应的block可能位于多个节点上,但考虑到任务调度的效率,通常不会把所有节点加到InputSplit的host列表中,而是选择包含(该InputSplit)数据总量最大的前几个节点(Hadoop限制最多选择10个,多余的会过滤掉),以作为任务调度时判断任务是否具有本地性的主要凭证。
为此,FileInputFormat设计了一个简单有效的启发式算法:
首先按照rack包含的数据量对rack进行排序,然后在rack内部按照每个node包含的数据量对node排序,最后取前N个node的host作为InputSplit的host列表,这里的N为block副本数。
这样,当任务调度器调度Task时,只要将Task调度给位于host列表的节点,就认为该Task
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MapReduce 编程 模型
![提示](https://static.bdocx.com/images/bang_tan.gif)