理解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-09-30 19:16:32

理解MapReduce数据流的相关文章

2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理

这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.<Hadoop技术内幕:深入理解MapReduce架构设计与实现原理>董西成 著  机械工业出版社2013年5月出版 2.<Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理>蔡斌.陈湘萍 著  机械工业出版社2013年4月出版 百度网盘下载地址: http://pan.baidu.com/s/1sjNmkFj

MapReduce数据流

MapReduce的输入一般来自HDFS中的文件,这些文件分布存储在集群内的节点上.运行一个MapReduce程序会在集群的许多节点甚至所有节点上运行mapping任务,每一个mapping任务都是平等的:mappers没有特定“标识物”与其关联.因此,任意的mapper都可以处理任意的输入文件.每一个mapper会加载一些存储在运行节点本地的文件集来进行处理(译注:这是移动计算,把计算移动到数据所在节点,可以避免额外的数据传输开销). 当mapping阶段完成后,这阶段所生成的中间键值对数据必

MapReduce数据流(一)

在上一篇文章中我们讲解了一个基本的MapReduce作业由那些基本组件组成,从高层来看,所有的组件在一起工作时如下图所示: 图4.4高层MapReduce工作流水线 MapReduce的输入一般来自HDFS中的文件,这些文件分布存储在集群内的节点上.运行一个MapReduce程序会在集群的许多节点甚至所有节点上运行mapping任务,每一个mapping任务都是平等的:mappers没有特定“标识物”与其关联.因此,任意的mapper都可以处理任意的输入文件.每一个mapper会加载一些存储在运

MapReduce剖析笔记之一:从WordCount理解MapReduce的几个阶段

WordCount是一个入门的MapReduce程序(从src\examples\org\apache\hadoop\examples粘贴过来的): package org.apache.hadoop.examples; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path

MapReduce数据流(二)

输入块(InputSplit):一个输入块描述了构成MapReduce程序中单个map任务的一个单元.把一个MapReduce程序应用到一个数据集上,即是指一个作业,会由几个(也可能几百个)任务组成.Map任务可能会读取整个文件,但一般是读取文件的一部分.默认情况下,FileInputFormat及其子类会以64MB(与HDFS的Block默认大小相同,译注:Hadoop建议Split大小与此相同)为基数来拆分文件.你可以在hadoop-site.xml(译注:0.20.*以后是在mapred-

深入理解MapReduce的架构及原理

1. MapReduce 定义 Hadoop 中的 MapReduce是一个使用简单的软件框架.基于它写出来的应用程序能够执行在由上千个商用机器组成的大型集群上,并以一种可靠容错式并行处理TB级别的数据集 2. MapReduce 特点 MapReduce 为什么如此受欢迎?尤其如今互联网+时代,互联网+公司都在使用 MapReduce.MapReduce 之所以如此受欢迎.它主要有下面几个特点. - MapReduce 易于编程.它简单的实现一些接口,就能够完毕一个分布式程序.这个分布式程序能

理解MapReduce计算构架

用Python编写WordCount程序任务 程序 WordCount 输入 一个包含大量单词的文本文件 输出 文件中每个单词及其出现次数(频数),并按照单词字母顺序排序,每个单词和其频数占一行,单词和频数之间有间隔 1.编写map函数,reduce函数 首先先创建文件 然后编写两个函数 2.将其权限作出相应修改 3.本机上测试运行代码 4.放到HDFS上运行 5.下载并上传文件到hdfs上 先用WINSCP把两个txt文件传到虚拟机 然后上传文件到hdfs 6.用Hadoop Streamin

理解MapReduce

1. #!/usr/bin/env python import sys for line in sys.stdin: line=line.strip() words=line.split() for word in words: print '%s\t%s' % (word,1) #!/usr/bin/env python from operator import itemgetter import sys current_word=None current_count=0 word=None

MapReduce数据流-输入

原文地址:https://www.cnblogs.com/fanweisheng/p/11188276.html