您的位置:首页 > 编程语言

mapreduce编程模型学习--1

2014-05-05 09:38 253 查看
mapreduce适用的场景具有共同特点:任务能被分解为相互独立的子问题。

基于该特点的mapreduce给出了一个分布式编程方法,步骤如下:

1 迭代:遍历输入数据并解析为key/value对

2 将输入的key/value对映射(map)为另外的key/value对

3 按照key对中间数据分组(grouping)

4 以组为单位进行规约(reduce)

5 迭代:将最终产生的key/value对保存到输出文件中

好处:组件化、并行化

mapreduce包括:编程模型、运行时环境。

编程模型提供了如下编程组件:InputFormat Mapper Partitioner Reducer OutputFormat

运行时环境将MR程序部署到集群各个节点上,通过各种机制保证其运行。

一 MapReduce API基本概念:

1 序列化:将结构化对象转化为字节流以便于通过网络进行传输或写入持久存储的过程。在mapreduce中的作用主要是:永久存储、进程间通信。

反序列化:将字节流转化为结构化对象的过程。

为了能够读取或者存储jav对象,mapreduce编程模型要求用户输入和输出数据中的key、value必须是可序列化的,在mapreduce中使一个java对象可序列化的方法是让其对应的类实现Writable接口。但key是数据排序的关键字,因此需要实现WritableComparable接口(因为需提供比较两个key对象的方法)。

2 Reporter参数

它是mapreduce提供给应用程序的工具。应用程序可使用其中的方法报告完成进度(progress)、设定状态消息(setStatus)以及更新计数器(incrCounter)。Reporter是一个基础参数,mapreduce对外提供的大部分组件中均在其主要方法中添加了该参数。

3 回调机制

一种常见的设计模式,将工作流中的某个功能按照约定的接口暴露给外部使用者,为外部使用者提供数据或者要求外部使用者提供数据。mapreduce对外提供的五个组件都属于回调接口。当用户按照约定实现后,mapreduce运行时环境会自动调用它们。

二 InputFormat

主要用于描述输入数据的格式,功能:

数据切分:按照某种策略将输入数据切分成若干个split,以便确定map task的个数及对应的split

为Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对

FileInputFormat:

其最重要的功能是为各种InputFormat提供统一的getSplit方法。主要算法如下

新版API:

(1)文件切分算法:确定InputSplit数目以及每个InputSplit对应的数据段。对于FileInputFormat,有三个属性值确定。

splitSize=max{minSize,min{maxSize,blockSize}}

minSize:InputSplit的最小值,由配置参数mapred.min.split.size确定,默认是1.

maxSize:mapred.max.split.size代替旧版用户期望的InputSplitM,即根据用户设定的map task的个数计算出来的goalSize.

blockSize:文件在HDFS存储的block大小,不同文件不同,默认64KB

一旦splitSize确定。FileInputFormat将文件切分成大小为splitSize的InputSplit.

(2)host选择算法

下一步确定每个InputSplit的元数据信息<file,start,length,hosts>,其中hosts列表直接影响运行过程中的任务本地行。

HDFS上的文件以block组织,InputSplit划分算法可能导致一个InputSplit对应多个block,位于多个节点上。hadoop将数据本地性划分为node locality,rack locality,data center locality(未实现)。

不会把所有节点都加到InputSplit的hosts列表。而是选择包含该InputSplit数据总量最大的前几个节点(hadoop限制最多10个)以作为任务调度时判断任务是否具有本地性的主要凭证。FIleInputSplit的简单有效的启发式算法:先按照rack包含的数据量对rack进行排序,然后再rack内部按照每个node包含的数据量对node进行排序,最后取前N个node作为InputSplit的host列表,N为block的副本数。这样,当任务调度器调度task时,只要将task调度给hosts列表的节点,就认为该task满足本地性。

故,当InputSplit尺寸大于block尺寸时,map task总要从远程节点上读取一部分数据,不能实现完全数据本地性。故当使用基于FileInputFormat实现InputFormat时,为了提高map task数据本地性,尽量使InputSplit大小与block大小相同。

三 OutputFormat

用于描述输出数据的格式,能够将用户提供的key/value对写入特定格式的文件中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: