`
brandNewUser
  • 浏览: 446114 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MapReduce编程模型简介和总结

阅读更多

本文是董西成《Hadoop技术内幕》一书的读书总结。

 

 

 

 

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

  1. 迭代,遍历输入数据,将其解析成key/value对;
  2. 将输入key/value对映射map成另外一些key/value对;
  3. 根据key对中间结果进行分组(grouping);
  4. 以组为单位对数据进行归约;
  5. 迭代,将最终产生的key/value对保存到输出文件中。

下面就简要总结一下编程模型中用到的主要组件以及在其中的作用: 

 

1. InputFormat

主要用于描述输入数据的格式,提供数据切分功能,按照某种方式将输入数据且分成若干个split,确定map task的个数,以及为Mapper提供输入数据,给定某个split,让其解析成一个个key/value对。

InputFormat中的getSplits方法主要完成数据切分的功能,会尝试着将输入数据且分成numSplits个进行存储。InputSplit中只记录了分片的元数据信息,比如起始位置、长度以及所在的节点列表。

在Hadoop中对象的序列化主要用在进程间通信以及数据的永久存储。Client端会调用Job中的InputFormat中的getSplits函数,当作业提交到JobTracker端对作业初始化时,可以直接读取该文件,解析出所有InputSplit,并创建对应的MapTask。

而重要的方法就是getRecordReader,其返回一个RecordReader,将输入的InputSplit解析成若干个key/value对。MapReduce框架在Map Task执行过程中,不断地调用RecordReader对象中的方法,获取key/value对交给map函数处理,伪代码如下:

K1 key = input.createKey();
V1 value = input.createValue();
while(input.next(key, value)){
     //invoke map()
}
input.close();



对于FileInputFormat,这是一个采用统一的方法对各种输入文件进行切分的InputFormat,也是比如TextInputFormat, KeyValueInputFormat等类的基类。其中最重要的是getSplits函数,最核心的两个算法就是文件切分算法以及host选择算法。

文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段。

在InputSplit切分方案完成后,就需要确定每个InputSplit的元数据信息: <file, start, length, host>,表示InputSplit所在文件,起始位置,长度以及所在的host节点列表,其中host节点列表是最难确定的。

host列表选择策略直接影响到运行过程中的任务本地性。Hadoop中HDFS文件是以block为单位存储的,一个大文件对应的block可能会遍布整个集群,InputSplit的划分算法可能导致一个InputSplit对应的多个block位于不同的节点上。

hadoop将数据本地性分成三个等级:node locality, rack locality和data center locality。在进行任务调度时,会依次考虑3个节点的locality,优先让空闲资源处理本节点的数据,其次同一个机架上的数据,最差是处理其他机架上的数据。

虽然InputSplit对应的block可能位于多个节点上,但考虑到任务调度的效率,通常不会将所有节点到InputSplit的host列表中,而是选择数据总量最大的前几个节点,作为任务调度时判断任务是否具有本地性的主要凭据。对于FileInputFormat设计了一个简单有效的启发式算法:按照rack包含的数据量对rack进行排序,在rack内部按照每个node包含的数据量对node排序,取前N个node的host作为InputSplit的host列表(N为block的副本数,默认为3)。

当InputSplit的尺寸大于block的尺寸时,MapTask不能实现完全的数据本地性,总有一部分数据需要从远程节点中获取,因此当使用基于FileInputFormat实现InputFormat时,为了提高Map Task的数据本地性,应该尽量使得InputSplit大小与block大小相同。(虽然理论上是这么说,但是这会导致过多的MapTask,使得任务初始时占用的资源很大)。

2. OutputFormat

OutputFormat主要用于描述输出数据的格式,能够将用户提供的key/value对写入特定格式的文件中。其中与InputFormat类似,OutputFormat接口中有一个重要的方法就是getRecordWriter,返回的RecordWriter接收一个key/value对,并将之写入文件。Task执行过程中,MapReduce框架会将map或reduce函数产生的结果传入write方法:

public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException{
     output.collect(newKey, newValue);
}



hadoop中所有基于文件的OutputFormat都是从FileOutputFormat中派生的,事实上这也是最常用的OutputFormat。总结发现,FileOutputFormat实现的主要功能有两点:

  1. 为防止用户配置的输出目录数据被意外覆盖,实现checkOutputSpecs接口,在输出目录存在时抛出异常;
  2. 处理side-effect file。hadoop可能会在一个作业执行过程中加入一些推测式任务,因此,hadoop中reduce端执行的任务并不会真正写入到输出目录,而是会为每一个Task的数据建立一个side-effect file,将产生的数据临时写入该文件,待Task完成后,再移动到最终输出目录。


默认情况下,当作业成功完成后,会在最终结果目录下生成空文件_SUCCESS,该文件主要为高层应用提供作业运行完成的标识(比如oozie工作流就可以根据这个判断任务是否执行成功)。

3. Mapper和Reducer

Mapper的过程主要包括初始化、Map操作执行和清理三个部分。Reducer过程与Mapper过程基本类似。

  1. 初始化,Mapper中的configure方法允许通过JobConf参数对Mapper进行初始化工作;
  2. Map操作,通过前面介绍的InputFormat中的RecordReader从InputSplit获取一个key/value对,交给实际的map函数进行处理;
  3. 通过继承Closable接口,获得close方法,实现对Mapper的清理。

对于一个MapReduce应用,不一定非要存在Mapper,MapReduce框架提供了比Mapper更加通用的接口:org.apache.hadoop.mapred.MapRunnable,可以直接实现该接口定制自己的key/value处理逻辑(相对于MapReduce阶段中固定的map阶段,可以跳过Map阶段,比如Hadoop Pipes中的将数据发送给其他进程处理)。

MapRunner是其固定实现,直接调用用户job中设置的Mapper Class,此外,hadoop中还提供了一个多线程的MapRunnable实现,用于非CPU类型的作业提供吞吐率。

4. Partitioner

Partitoner的作用是对Mapper产生的中间结果进行分片,将同一分组的数据交给一个Reducer来处理,直接影响这Reducer阶段的负载均衡。其中最重要的方法就是getPartition,包含三个参数,key,value,以及Reducer的个数numPartions。

MapReduce提供两个Partitioner实现,HashPartitoner和TotalOrderPartitioner。HashPartitioner是默认实现,基于哈希值进行分片(曾在一篇文章中讲了一次Partition的开发和测试过程:http://brandnewuser.iteye.com/blog/2122852);TotalOrderPartitoner提供了一种基于区间分片的方法,通常用在数据的全排序中。例如归并排序,如果Map Task进行局部排序后Reducer端进行全局排序,那么Reducer端只能设置成1个,这会成为性能瓶颈,为了提高全局排序的性能和扩展性,并保证一个区间中的所有数据都大于前一个区间的数据,就会用到TotalOrderPartitioner。

本文主要参考《Hadoop技术内幕-MapReduce架构设计》(董西成著)一书。




  • 大小: 18.4 KB
分享到:
评论

相关推荐

    Mapreduce实验报告.doc

    Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后...

    MapReduce源码分析总结

    其中对它的定义是,Map/Reduce是一个编程模型(programmingmodel),是一个用于处理和生成大规模数据集(processingandgeneratinglargedatasets)的相关的实现。用户定义一个map函数来处理一个key/value对以生成一批...

    深入理解大数据--大数据并行处理与编程实践

    ■ Hadoop MapReduce并行编程模型、框架与编程接口 ■ 分布式数据表HBase ■ 分布式数据仓库Hive ■ Intel Hadoop系统优化与功能增强 ■ MapReduce 基础算法程序设计 ■ MapReduce高级程序设计技术 ■ MapReduce机器...

    Hadoop从入门到上手企业开发

    049 MapReduce编程模型讲解及运行PI程序和JobWebUI监控Job运行 050 如何按照【八股文】方式编写MapReduce 051 复习MapReduce编写模型和【八股文】方式编写MapReduce 052 完成MyWordCount程序编写 053 打包运行...

    深入理解大数据:大数据处理与编程实践

    全书的主要内容包括:■ 大数据处理技术与Hadoop MapReduce简介■ Hadoop系统的安装和操作管理■ 大数据分布式文件系统HDFS■ Hadoop MapReduce并行编程模型、框架与编程接口■ 分布式数据库HBase■ 分布式...

    大数据实验报告.docx

    4、掌握MapReduce编程模型 5、通过社交好友推荐学会MapReduce的编程思路 开发工具 1、Jdk 2、Hadoop 3、Eclipse 项目描述 如果A和B具有好友关系,B和C具有好友关系,而A和C却不是好友关系,那么我们称A和C这样的...

    云计算读书报告.docx

    云计算相关的主要有虚拟化技术,SaaS服务模式,分布式文件系统,非关系型数据库,MapReduce编程模型,hadoop架构。其主要代表作品有Google的云计算产品和技术,Microsoft云+端技术,以及各种SaaS软件应用实例,下面...

    大数据系统基础(自主模式)-清华大学-王建民、徐葳、陈康等 视频.txt

    │ 1 4.2MapReduce编程模型.mp4 │ 10 4.11Pig Latin 实现与优化.mp4 │ 11 Pig Latin 实现与优化(2).mp4 │ 12 4.13类似框架.mp4 │ 13 4.14章节总结.mp4 │ 2 MapReduce执行过程.mp4 │ 3 4.4MapReduce数据流....

    探索C#之微型MapReduce

    MapReduce近几年比较热的分布式计算编程模型,以C#为例简单介绍下MapReduce分布式计算。  阅读目录  背景  Map实现  Reduce实现  支持分布式  总结  背景  某平行世界程序猿小张接到Boss一项任务,...

    云计算第二版

    6.8 MapReduce编程 223 6.8.1 矩阵相乘算法设计 223 6.8.2 编程实现 224 习题 226 参考文献 226 第7章 Eucalyptus:Amazon云计算的开源实现 228 7.1 Eucalyptus简介 228 7.2 Eucalyptus技术实现 229 7.2.1 体系结构 ...

    大数据基础知识入门.pdf

    Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数 据集操作类型,编程模型比Hadoop MapReduce更灵活。 Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制,因此 ...

    hadoop.doc

    Hadoop原本来自于谷歌一款名为MapReduce的编程模型包。谷歌的MapReduce框架可以把一个应用程序分解为许多并行计算指令,跨大量的计算节点运行非常巨大的数据集。使用该框架的一个典型例子就是在网络数据上运行的搜索...

    最新C++网络编程实践视频教程 陈硕

    1.网络编程概要.mkv2.一个TCP的简单实验.mkv3.课程内容大纲.mkv4.回顾基础的Sockets API.mkv5.TTCP代码概览.mkv6.使用TTCP进行网络传输性能测试.mkv7.阻塞IO下的TTCP实验.mkv8.TCP自连接.mkv9.扩展练习.mkv10.时钟...

    大数据期末知识点总结.pdf

    函数式编程的特征: 函数式编程的特征: 没有副作⽤、⽆状态编程、只有输⼊值与输出值 Mapreduce是⾕歌针对⼤规模群组中的海量数据处理⽽提出的分布式编程模型 Hadoop 是⼀个⽤于收集、共享和分析来⾃⽹络的⼤量结构...

    37篇经过消化的云计算论文

    GridBatch系统为解决在云计算下的大规模精密数据批处理问题,GridBatch是一个编程模型,用户能控制数据的分割,控制计算怎么被分布的,最后给出一个例子,展示了他在EC2下的高性能。 8、 Cost-Benefit Analysis of ...

    37篇经过消化云计算论文打包下载

    GridBatch系统为解决在云计算下的大规模精密数据批处理问题,GridBatch是一个编程模型,用户能控制数据的分割,控制计算怎么被分布的,最后给出一个例子,展示了他在EC2下的高性能。 8、 Cost-Benefit Analysis of...

    大数据应用-基于大数据的推荐算法研究.pptx

    矩阵分解并行化 MapReduce编程模型 大数据应用-基于大数据的推荐算法研究全文共35页,当前为第22页。 矩阵分解并行化 a11 a12 a13 a21 a22 a23 a31 a32 a33 a41 a42 a43 左矩阵A b11 b12 b13 b14 b21 b22 b23 b24 ...

    第七章-《大数据导论》大数据处理平台.pdf

    数据访问瓶颈 大数据处理平台的特点 通过分布式计算框架来实现 提供高效的计算模型和简单的编程接口 可扩展性:通过增加资源以满足不断增加的性能和功能需求 容错能力:考虑系统的不可靠性,支持出现错误后自动恢复 ...

    我对大数据的看法.pdf

    Hadoop项⽬包括三部分,分别是Hadoop Distributed FileSystem(HDFS)、HadoopMapReduce编程模型,以及Hadoop Common。 不适合使⽤Hadoop来解决的问题:1、最最重要⼀点,Hadoop能解决的问题必须是可以MapReduce的;...

Global site tag (gtag.js) - Google Analytics