MapReduce执行流程及示例

MapReduce简介

MapReduce是分布式计算框架,由Google提出,主要用于解决海量数据的计算问题。
MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出。Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。整个流程如图:


MapReduce执行流程

执行过程详解

1. map阶段

每个Mapper任务是一个java进程,它会读取HDFS中的文件,解析成很多的键值对,经过我们覆盖的map方法处理后,转换为很多的键值对再输出。整个Mapper任务的处理过程又可以分为以下几个阶段,如图所示:

map阶段

在上图中,Mapper任务的运行过程可以分为六个阶段。

  • 第一阶段:mapreduce会根据输入文件计算输入分片(InputSplit)。

输入分片往往和hdfs的block(块)关系很密切。假如每个hdfs块的大小是64mb,如果我们输入有三个文件,大小分别是3mb、65mb和127mb,那么mapreduce会把3mb文件分为一个输入分片,65mb则是两个输入分片而127mb也是两个输入分片。换句话说如果我们不在map计算前对输入分片调整,例如合并小文件,那么就会有5个map任务将执行,而且每个map执行的数据大小不均,这个也是mapreduce优化计算的一个关键点

notes:默认分片大小与分块大小相同是有原因的
Hadoop在输入数据所在的节点上运行map任务,可以获得高性能,这就是所谓的数据本地化。
所以最佳分片的大小应该与HDFS上的块大小一样,因为如果分片跨越2个数据块,分片中的另外一块数据就需要通过网络传输到map任务节点,与使用本地数据运行map任务相比,效率则更低!
Hadoop分块与分片介绍

  • 第二阶段:对输入分片的记录按照一定的规则解析成键值对。

有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。

  • 第三阶段:将第二阶段解析出来的每一个键值对,调用一次map方法。

如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出零个或者多个键值对。

  • 第四阶段:按照一定的规则对第三阶段输出的键值对进行分区,分区是基于键进行的。

假设我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。默认是只有一个区,分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。

  • 第五阶段:对每个分区中的键值对进行排序。

首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。如果有第六阶段,那么进入第六阶段;如果没有,直接输出到本地的linux文件中。

  • 第六阶段:对数据进行归约处理,也就是reduce处理。

键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要用户自己增加这一阶段的代码。

2. reduce阶段

每个Reducer任务是一个java进程。Reducer任务接收Mapper任务的输出,归约处理后写入到HDFS中,可以分为如下图所示的几个阶段。

reduce阶段

在上图中,Reduce任务的运行过程可以分为三个阶段。

  • 第一阶段:Reducer任务会主动从Mapper任务复制其输出的键值对。

Mapper任务可能会有很多,因此Reducer会复制多个Mapper的输出。

  • 第二阶段:把复制到Reducer本地数据,全部进行合并。

即把分散的数据合并成一个大的数据,再对合并后的数据排序。

  • 第三阶段:对排序后的键值对调用reduce方法。

键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。

  • 注意:Mapper阶段是并行读取处理的它的数量是由切片的数量决定的;而Reducer阶段默认是只有一个区,可以通过key进行规划,达到并行计算。

比如:
10个key可以有1个reducer,但是这个reducer只能一次处理一个key,也就是说处理10次;
10个key可以有大于10个reducer ,只不过有的reduce不进行key的处理;
10个key有10个reducer,这是最合理的分配,达到并行计算。

3. shuffle阶段

shuffle阶段是指从Map结束到Reduce开始之间的过程。从下这张图中可以了解shuffle所处的位置。

shuffle阶段

注意:一个切片对应一个Map任务,每个Map任务会根据分片中的记录执行多次mapper函数。一个分区对应一个Reduce任务。

  • Map端:每一个Mapper进程都有一个环形的内存缓冲区,用来存储Map阶段分区后的输出数据。

1)这个内存缓冲区的默认大小是100MB,当数据达到阙值0.8,也就是80MB的时候,开始溢出成spill文件,然后进行分区、排序(快速排序),(如果有combiner,可以使数据更紧凑,降低写入磁盘的数据量)然后写入磁盘。(如果Map输出比较小,会直接复制到内存
2)当最后一个spill文件写入磁盘后,将多个spill文件合并到一个已经分区的大文件中,并排序。(如果由combiner,此时也会运行)

  • Reduce端:Reduce任务通过HTTP方式从磁盘上复制数据,(Reduce任务有少量的复制线程,默认是5个),有一个Map任务执行完成后就可以开始复制了,但是Reduce端通常需要从多个Map端复制数据

一个reduce task中的多个小文件,可能来自于多个map task,但是它们的分区号相同。

-----------------------分------------------割----------------线-------------------------

求每年最高气温

Map端

  • 第一阶段:输入切片

2014010114
2014010216
2014010317
2014010410
2014010506
2012010609
2012010732
2012010812
2012010919
2012011023
2001010116
2001010212
2001010310
2001010411
2001010529
2013010619
2013010722
2013010812
2013010929
2013011023
2008010105
2008010216
2008010337
2008010414
2008010516
2007010619
2007010712
2007010812
2007010999
2007011023
2010010114
2010010216
2010010317
2010010410
2010010506
2015010649
2015010722
2015010812
2015010999
2015011023

  • 第二阶段:把每一行文本内容解析成键值对。

<0, 2014010114>
<11, 2014010216>
<22, 2014010317>
<33, 2014010410>
<44, 2014010506>
<55, 2012010609>
<66, 2012010732>
...
...
<374, 2010010506>
<385, 2015010649>
<396, 2015010722>
<407, 2015010812>
<418, 2015010999>
<429, 2015011023>

  • 第三阶段:将第二阶段解析出来的每一个键值对,调用一次map方法。

<2014, 14>
<2014, 16>
<2014, 17>
<2014, 10>
...
...
<2015, 49>
<2015, 22>
<2015, 12>
<2015, 99>
<2015, 23>

  • 第四阶段:按照一定的规则对第三阶段输出的键值对进行分区。

假设只有一个分区(只有一个Reduce任务)

  • 第五阶段:分区是基于键进行的。并且根据键对分区进行排序。

<2001, 10>
<2001, 11>
<2001, 12>
...
...
...
<2015, 49>
<2015, 99>

  • 第六阶段:对数据进行归约处理,默认没有,可以自定义。

<2001, [12, 10, 11, 29, 16]>
<2007, [23, 19, 12, 12, 99]>
<2008, [16, 14, 37, 16, 5]>
<2010, [10, 6, 14, 16, 17]>
<2012, [19, 12, 32, 9, 23]>
<2013, [23, 29, 12, 22, 19]>
<2014, [14, 6, 10, 17, 16]>
<2015, [23, 49, 22, 12, 99]>

  • reduce端:读取磁盘上的数据,调用reduce方法。

<2001, 29>
<2007, 99>
<2008, 37>
<2010, 17>
<2012, 32>
<2013, 29>
<2014, 17>
<2015, 99>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容