MapReduce 计算模型

前言

  本文讲解Hadoop中的编程及计算模型MapReduce,并将给出在MapReduce模型下编程的基本套路。

模型架构

  在Hadoop中,用于执行计算任务(MapReduce任务)的机器有两个角色:一个是JobTracker,一个是TaskTracker,前者用于管理和调度工作,后者用于执行工作。

  一般来说,一个Hadoop集群由一个JobTracker和N个TaskTracker构成。

执行流程

  每次计算任务都可以分为两个阶段,Map阶段和Reduce阶段。

  其中,Map阶段接收一组键值对模式<key, Value>的输入并产生同样是键值对模式<key, Value>的中间输出;

  Reduce阶段负责接收Map产生的中间输出<key, Value>,然后对这个结果进行处理并输出结果。

  这里举个很简单的例子,有一个程序用来统计文本中各个单词出现的个数,那么每个Map任务可以负责提取出文本中的所有单词并产生n个<word, 1>这样的输出;

  而Reduce任务可以负责对这些中间输出做出处理,转换成<word, n> 这样的输出。

编码框架说明

  编码涉及到一些细节,建议结合具体代码进行分析,这里只给出一个框架性的说明。推荐阅读经典的wordcount程序。

  1. 导入Hadoop开发需要用到的一些包

  2. 定义一个需要用到分布式计算的类

  3. 在此类中添加Map类,并使该类继承Mapper抽象类,然后实现该抽象类中的map方法。

  4. 在此类中添加Reduce类,并使该类继承Reducer抽象类,然后实现该抽象类中的reduce方法。

  5. 在类中定义一个成员函数并做如下操作:

    a. 定义一个Job对象负责job调度

    b. 往a中定义的job对象中注入2中定义的分布式类 (setJarByClass)

    c. 定义分布式任务的名字 (setJobName)

    d. 往a中定义的job对象中注入输出的key和value的类型 (setOutPutKeyClass,setOutPutKeyClass)

    e. 往a中定义的job对象中注入3和4中定义的Map,Reduce类

    f. 往a中定义的job对象中注入数据切分格式类 (setInputFormat,setOutputFormat)

    g. 往a中定义的job对象中注入输出的路径地址 (setInputPaths,setOutputPath)

    h. 启动计算任务 (waitForCompletion)

    i. 返回布尔类型的执行结果

  6. 在主函数中调用上述方法 (命令行方式)

运行方法

  1. 执行以下格式的命令以编译分布式计算类

1 javac -classpath "hadoop目录下的core.jar" -d "结果输出目录" "分布式类文件名"

  2. 执行以下格式的命令将该类打包成jar

1 jar -cvf "结果文件名(后缀.jar)" -C "目标目录" "结果输出目录"

  3. 执行以下格式的命令将输入文件存入HDFS文件系统 (该命令将在HDFS上创建一个名为input的目录并将用户目录下input目录内前缀为file的文件导入进去):

1 dfs -mkdir input
2 dfs -put ~/input/file0* input

  4. 执行以下格式的命令启动hadoop程序 (下面的参数一和二一般分别指输入和输出目录)

1 jar "分布式类jar包" "分布式类名" 参数一,参数二......

MapReduce的数据流和控制流

  下面来讨论一下Hadoop程序的数据流和控制流的关系,首先请看下图:

  首先,由Master,也即JobTracker负责分派任务到下面的各个worker,也即TaskTracker。

  某个worker在执行的时候,会返回进度报告,master负责记录进度的进行状况。

  若某个worker失败,那么master会分派这个执行失败的任务给新的worker。

程序优化技巧

  MapReduce程序的优化主要集中在两个方面:一个是运算性能方面的优化;另一个是IO操作方面的优化。

  具体体现在以下的几个环节之上:

    1. 任务调度

      a. 尽量选择空闲节点进行计算

      b. 尽量把任务分配给InputSplit所在的机器

    2. 数据预处理与InputSplit的大小

      尽量处理少量的大数据;而不是大量的小数据。因此可以在处理前对数据进行一次预处理,将数据进行合并。

    3. Map和Reduce任务的数量

      Map任务槽中任务的数量需要参考Map的运行时间,而Reduce任务的数量则只需要参考Map槽中的任务数,一般是0.95或1.75倍。

    4. 使用Combine函数

      该函数用于合并本地的数据,可以大大减少网络消耗。具体请参考函数手册。

    5. 压缩

      可以对一些中间数据进行压缩处理,达到减少网络消耗的目的。

    6. 自定义comparator

      可以自定义数据类型实现更复杂的目的。

 小结

  本文大致讲解了Hadoop的编程模型MapReduce,并大致介绍了如何在这个框架下进行简单的程序开发。

  更复杂的框架剖析以及Hadoop高级程序开发,将在以后的文章中进行细致的探讨。

时间: 2024-08-16 02:52:53

MapReduce 计算模型的相关文章

从 WordCount 到 MapReduce 计算模型

概述 虽然现在都在说大内存时代,不过内存的发展怎么也跟不上数据的步伐吧.所以,我们就要想办法减小数据量.这里说的减小可不是真的减小数据量,而是让数据分散开来.分开存储.分开计算.这就是 MapReduce 分布式的核心. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Coding-Naga 发表日期: 2016年5月10日 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/513677

MapReduce计算模型二

之前写过关于Hadoop方面的MapReduce框架的文章MapReduce框架Hadoop应用(一) 介绍了MapReduce的模型和Hadoop下的MapReduce框架,此文章将进一步介绍mapreduce计算模型能用于解决什么问题及有什么巧妙优化. MapReduce到底解决什么问题? MapReduce准确的说,它不是一个产品,而是一种解决问题的思路,能够用分治策略来解决问题.例如:网页抓取.日志处理.索引倒排.查询请求汇总等等问题.通过分治法,将一个大规模的问题,分解成多个小规模的问

NOSQL(六)集群并发计算模型Map-Reduce

<NoSQL精粹>读书笔记,转载请注明出处<jiq?钦's technical Blog> 面向聚合的数据库能够兴起,很大程度上是由于集群的增长.集群不仅改变了数据存储的规则,还改变了数据计算的方式. 集中式数据库通常两种方式处理计算逻辑:一种是在数据库服务器上执行数据计算.一种是在客户端计算机上执行数据计算.把数据库放到集群之后,采用的计算方式是将计算分布到多台计算机上,同时为了尝试减少网络传输的数据量,把节点所需的数据尽可能多地放到该节点上执行.这就是所谓的"Map-

大数据图数据库之离线挖掘计算模型

/* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/            author: 张俊林 节选自<大数据日知录:架构与算法>十四章,书籍目录在此 对于离线挖掘类图计算而言,目前已经涌现出众多各方面表现优秀而各具特点的实际系统,典型的比如Pregel.Giraph.Hama.PowerGraph.GraphLab.GraphChi等.通过对这些系统的分析,我们可以归纳出离线挖掘类图计算中一些常见的计算模型. 本节将常见的计算模型分为两类,一类是图编程模型,另一类

【MapReduce】二、MapReduce编程模型

??通过前面的实例,可以基本了解MapReduce对于少量输入数据是如何工作的,但是MapReduce主要用于面向大规模数据集的并行计算.所以,还需要重点了解MapReduce的并行编程模型和运行机制. ??我们知道,MapReduce计算模型主要由三个阶段构成:Map.shuffle.Reduce.Map和Reduce操作需要我们自己定义相应Map类和Reduce类.而shuffle则是系统自动帮我们实现的,是MapReduce的"心脏",是奇迹发生的地方.是其主要流程基本如下图所示

Hadoop 学习笔记二 --- 计算模型MapReduce

       MapReduce 是一个计算模型,也是一个处理和生成超大数据集的算法模型的相关实现.用户首先创建一个Map函数处理一个基于Key/Value pair 的数据集合,输出中间的基于Key/Value pair的数据集合,然后再创建一个Reduce 函数用来合并所有的具有相同中间Key值的中间Value值.其最主要的两个部分就是Map过程和Reduce过程. 一. Map 处理过程 1. Mapper 类的处理原理        Mapper 类的最主要的功能就是将输入的Key/Va

使用mapreduce计算环比的实例

最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个例子,也算是对自己写的程序的总结了. 首先解释下环比,例如我们要算本周的环比,那么计算方式就是本周的数据和上周数字的差值除以上周数值就是环比了,如果是月的环比就是本月和上月数据的差值除以上月数字就是本月环比了.不过本mapreduce实例不会直接算出比值,只是简单求出不同时间段数值的差值,最终环比结

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上的实现

转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示:  关于上图,可以做出以下逐步分析: 输入数据(待处理)首先会被切割分片,每一个分片都会复制多份到HDFS中.上图默认的是分片已经存在于HDFS中. Hadoop会在存储有输入数据分片(HDFS中的数据)的节点上运行map任务,可以获得最佳性能(数据TaskTracker优化,节省带宽). 在运行完map任务