理解MapReduce数据流

先理解MapReduce作业组成

     一个完整的MapReduce作业称作job,它包括三部分:

    1. 输入数据
    2. MapReduce程序
    3. 配置信息     

     Hadoop工作时会将job分成若干个task:map任务和reduce任务 

     有两类节点控制作业执行的过程:JobTrackerTaskTracker

    • JobTracker:记录作业整体进度,对TaskTracker进行调度
    • TaskTracker:执行task任务并向JobTracker汇报    

大块数据先流入map

     Hadoop会将输入数据划分成等长的数据块,成为数据分片。Hadoop会为每个分片构建一个map任务。并行的处理分片时间肯定会少于处理整个大数据块的时间,但由于各个节点性能及作业运行情况的不同,每个分片的处理时间可能不一样,因此,把数据分片切分的更细可以得到更好的负载均衡

     但另一方面,分片太小的话,管理分片和构建map任务的时间将会增多。因此,需要在hadoop分片大小和处理分片时间之间做一个权衡。对大多数作业来说,一个分片大小为64MB比较合适,其实,Hadoop的默认块大小也是64MB。

     我们上面看到了hadoop的数据块大小与最佳分片大小相同,这样的话,数据分片就不容易跨数据块存储,因此,一个map任务的输入分片便可以直接读取本地数据块,这就避免了再从其它节点读取分片数据,从而节省了网络开销。

     map的任务输出是写入到本地磁盘而非HDFS的。那么为什么呢?因为map任务输出的是中间结果,一旦map任务完成即会被删除,如果把它存入HDFS中并实现备份容错,未免有点大题小做。如果一个map任务失败,hadoop会再另一个节点重启map一个map任务。

数据从map流入reduce

     而reduce任务并不具备数据本地化优势——单个reduce任务的输入通常来自所有mapper输出。一般排序过的map输出需要通过网络传输发送到运行reduce任务的节点,并在reduce端进行合并。reduce的输出通常需要存储到HDFS中以实现可靠存储。每个reduce输出HDFS块第一个复本会存储在本地节点,而其它复本则存储到其它节点,因此reduce输出也需要占用网络带宽

如下图:一个reduce任务的MapReduce任务数据流

     reduce任务的数量并非由输入数据大小决定,而是特别指定。如有多个reduce任务,则每个map任务都会对其输出进行分区(partition),因为每个reduce任务会建一个分区。相同键的记录都会被partition到同一个分区中。具体的分区方式由分区函数来控制,一般通过hash函数来分区。

     我们把map任务和reduce任务之间的数据流称为shuffle,因为每个reduce任务的输入都来自多个map任务,因此,这个阶段比较复杂,而shuffle过程中的参数调整对job运行的总时间是有非常大的影响的,一般MapReduce的调优主要就是调整shuffle阶段的参数。

如下图:多个reduce任务的数据流

如何减少从map到reduce的数据量

     集群上的可用带宽限制了MapReduce的作业数量,因为map的中间结果传递给reduce是要经过网络传输的,因此最重要的一点就是尽量减少map和reduce任务间传输的数据量。不过,Hadoop允许用户针对map任务的输出指定一个合并函数(combiner),用合并函数的输出作为reduce函数的输入,但需要注意,合并函数的运用不应该改变reduce函数的计算结果。

     例如有两个map的输出分别是map1={0,20,10};map2={15,25},求最大值,我们可以对先每个map的数据的数据进行合并,合并完成之后再传输给reducer:

     map1={0,20,10}->combiner->{20};

     map2={15,25}->combiner->{25};

     reducer->{25}

     即 max(0,20,10,15,25)=max(max(0,20,10),max(15,25))=25

如下图:将combiner后的输出作为reducer的输入

     

     但需要特别注意的是,并不是任何场景都是可以用combiner的,比如把上面的例子改成求平均值:

    • combiner后的reducer的结果:       avg(avg(0,20,10),avg(15,25))=avg(10,20)=15;
    • 没有进行combiner的reducer结果:  avg(0,20,10,15,25)=14;
时间: 2024-07-31 05:03:17

理解MapReduce数据流的相关文章

理解MapReduce哲学

Google工程师将MapReduce定义为一般的http://www.aliyun.com/zixun/aggregation/14345.html">数据处理流程.一直以来不能完全理解MapReduce的真义,为什么MapReduce可以"一般"? 最近在研究Spark,抛开Spark核心的内存计算,这里只关心Spark做了什么.在Spark上的所有工作都是围绕数据集进行,包括创建新的数据集.对数据集的转换.对数据集的归约.对于实际应用中的数据处理流程,Spark的

快速理解MapReduce

1 什么是MapReduce? Map本意可以理解为地图,映射(面向对象语言都有Map集合),这里我们可以理解为从现实世界获得或产生映射.Reduce本意是减少的意思,这里我们可以理解为归并前面Map产生的映射. 2 MapReduce的编程模型 按照google的MapReduce论文所说的,MapReduce的编程模型的原理是:利用一个输入key/value对集合来产生一个输出的key/value对集合.MapReduce库的用户用两个函数表达这个计算:Map和Reduce.用户自定义的Ma

基于Hadoop系统的MapReduce数据流优化

1 Hadoop管道改进思想 在Hadoop系统的实现中,Map端的输出数据首先被溢写入本地磁盘,当本机任务完成后通知JobTracker,然后Reduce端在得到 JobTracker的通知后会发出HTTP请求,利用复制的方式从相应的Map端拉回其输出.这样的方式只能等该Map任务完成后才能开始执行 Reduce任务,并且Map任务和Reduce任务的执行是分离的. 我们的改进思想是使Map任务和Reduce任务能够以管道的方式执行,即Map任务开始产生输出后直接发送给相应的Reduce任务,

《R与Hadoop大数据分析实战》一2.3 Hadoop MapReduce原理

2.3 Hadoop MapReduce原理 为了更好地理解MapReduce的工作原理,我们将会: 学习MapReduce对象. MapReduce中实现Map阶段的执行单元数目. MapReduce中实现Reduce阶段的执行单元数目. 理解MapReduce的数据流. 深入理解Hadoop MapReduce. 2.3.1 MapReduce对象 由Hadoop的MapReduce技术可以引申出如下3个主要对象: Mapper:它主要用于实现MapReduce的Map阶段的操作.该对象在M

六点解读Hadoop版本、生态圈及MapReduce模型

Hadoop版本和生态圈 1. Hadoop版本 (1) Apache Hadoop版本介绍 Apache的开源项目开发流程: 主干分支:新功能都是在主干分支(trunk)上开发. 特性独有分支:很多新特性稳定性很差,或者不完善,在这些分支的独有特定很完善之后,该分支就会并入主干分支. 候选分支:定期从主干分支剥离,一般候选分支发布,该分支就会停止更新新功能,如果候选分支有BUG修复,就会重新针对该候选分支发布一个新版本,候选分支就是发布的稳定版本. 造成Hadoop版本混乱的原因: 主要功能在

Hadoop 版本 生态圈 MapReduce模型

(1) Apache Hadoop版本介绍 Apache的开源项目开发流程 : -- 主干分支 : 新功能都是在 主干分支(trunk)上开发; -- 特性独有分支 : 很多新特性稳定性很差, 或者不完善, 在这些分支的独有特定很完善之后, 该分支就会并入主干分支; -- 候选分支 : 定期从主干分支剥离, 一般候选分支发布, 该分支就会停止更新新功能, 如果候选分支有BUG修复, 就会重新针对该候选分支发布一个新版本;候选分支就是发布的稳定版本; 造成Hadoop版本混乱的原因 : -- 主要

《Hadoop与大数据挖掘》——2.6 TF-IDF算法原理及Hadoop MapReduce实现

2.6 TF-IDF算法原理及Hadoop MapReduce实现 2.6.1 TF-IDF算法原理 原理:在一份给定的文件里,词频(Term Frequency,TF)指的是某一个给定的词语在该文件中出现的次数.这个数字通常会被正规化,以防止它偏向长的文件(同一个词语在长文件里可能会比在短文件里有更高的词频,而不管该词语重要与否).逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量.某一特定词语的IDF可以由总文件数目除以包含该词语的文件的数

MapReduce核心map reduce shuffle (spill sort partition merge)详解

  Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.如果你不知道MapReduce里 Shuffle是什么,那么请看这张图:         这张是官方对Shuffle过程的描述.但我可以肯定的 是,单从这张图你基本不可能明白Shuffle的过程,

Hadoop专业解决方案-第3章:MapReduce处理数据

前言:非常感谢团队的努力,最新的章节终于有了成果,因为自己的懒惰,好久没有最新的进展了,感谢群里兄弟的努力. 群名称是Hadoop专业解决方案群  313702010 本章主要内容: 理解MapReduce基本原理 了解MapReduce应用的执行 理解MapReduce应用的设计 截止到目前,我们已经知道Hadoop如何存储数据,但Hadoop不仅仅是一个高可用 的,规模巨大的数据存储引擎,它的另一个主要特点是可以将数据存储与处理相结合. Hadoop的核心处理模块是MapReduce,也是当