微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hadoop中MapReduce的执行过程及shuffle过程

文章目录

1. MapReduce简介

  • MapReduce是一种分布式计算模型,是Google提出的,主要用于搜索领域,解决海量数据的计算问题。
  • MR有两个阶段组成:Map和Reduce,用户只需实现map()和reduce()两个函数,即可实现分布式计算。

2. MapReduce的执行过程

总的来说MapReduce的过程可以划分为三个部分:

1)Map: 数据映射。首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆映射成键值对,最后输出作为Reduce的输入。
2)Shuffle:从Map的数据输出到Reduce的数据输入过程对数据的分区,排序过程。
3)Reduce: 数据汇总。Reducer任务接收Mapper任务的输出,归约处理后写入到HDFS中。

在这里插入图片描述

2.1 Map过程

  • 第一阶段是把输入文件按照一定的标准分片 (InputSplit),每个输入片的大小是固定的。认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。如果数据块(Block)的大小是认值64MB,输入文件有两个,一个是32MB,一个是72MB。那么小的文件一个输入片,大文件会分为两个数据块,那么是两个输入片,一共产生三个输入片。一个输入片由一个Mapper进程处理,这里的三个输入片,会有三个Mapper进程处理。
  • 第二阶段是对输入片中的记录按照一定的规则解析成键值对,有个认规则是把每一行文本内容解析成键值对,这里的“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容
  • 第三阶段是调用Mapper类中的map方法,在第二阶段中解析出来的一个键值对,调用一次map方法(其实就是每一行划分,映射),如果有1000个键值对,就会调用1000次map方法,每一次调用map方法输出零个或者多个键值对。

从这一步开始,map就会将数据进行输出了,下面的过程就是Shuffle的过程。

2.2 Shuffle过程

Hadoop MapReduce 的 Shuffle 阶段是指从 Map 的输出开始,包括系统执行排序,以及传送 Map 输出到 Reduce 作为输入的过程。

Shuffle的过程总结来说就是,对Map的输出进行排序分区,指定某个分区输出的Reduce节点,减少跨节点数据传输的带宽。

就是将 MapTask 输出的处理结果数据,按照 Partitioner 组件制定的规则分发给ReduceTask,并在分发的过程中,对数据按 key 进行了分区和排序。

排序阶段是指对 Map 端输出的 Key 进行排序的过程。不同的 Map 可能输出相同的 Key,相同的 Key 必须发送到同一个 Reduce 端处理。Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段。Shuffle 阶段的工作过程,如图 2 所示。

在这里插入图片描述

Map端Shuffle过程:

1).Collect阶段:Map 函数开始产生输出时,并不是简单地把数据写到磁盘中,因为频繁的磁盘操作会导致性能严重下降。它的处理过程是把数据首先写到内存中的一个缓冲区,以提升效率。

Collect阶段将MapTask的结果输出认大小为100M的环形缓冲区,保存的是key/value序列化数据,Partition分区信息等。

2).Spill 阶段:当缓冲区中的数据量达到一个特定阈值(认是 80%)时,系统将会启动一个后台线程,把缓冲 区中的内容写到磁盘中(即 Spill 阶段)。在写磁盘前,线程首先根据数据最终要传递到的 Reduce 任务把数据划分成相应的分区(Partition)。在每个分区中,后台线程按 Key 进行排序,如果有一个 Combiner,便会在排序后的输出上运行。

在写磁盘过程中,Map 输出继续被写到缓冲区中,但如果在此期间缓冲区被填满,那么 Map 任务就会阻塞直到写磁盘过程完成

3).Merge 阶段:一旦内存缓冲区达到溢出写的阈值,就会创建一个溢出写文件,因此在 Map 任务完成其最后一个输出记录后,便会有多个溢出写文件。在 Map 任务完成前,溢出写文件被合并成一个索引文件和数据文件。把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件

溢出写文件归并完毕后,Map 任务将删除所有的临时溢出写文件,并告知 TaskTracker 任务已完成,只要其中一个 Map任务完成,Reduce 任务就会开始复制它的输出

Map 任务的输出文件放置在运行 Map 任务的 TaskTracker 的本地磁盘上,它是运行 Reduce 任务的TaskTracker 所需要的输入数据。

Reduce端Shuffle过程:

4).copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。

5).Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程(一个是内存到磁盘的合并,一个是磁盘到磁盘的合并)对内存到本地的数据文件进行合并操作。

最终文件可能存在于磁盘中,也可能存在于内存中,但是认情况下是位于磁盘中的。当 Reduce 的输入文件已定,整个 Shuffle 阶段就结束了,然后就是 Reduce 执行,把结果放到 HDFS 中(Reduce 阶段)。

6).sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask 阶段已经对数据进行了局部的排序,ReduceTask只需保证copy的数据的最终整体有效性即可。

2.3 Reduce过程

在这里插入图片描述

  • Reduce在接收到数据之后,对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。

在这里插入图片描述

3. 为什么有Shuffle过程

因为不同的 Map 可能输出相同的 Key,相同的 Key 必须发送到同一个 Reduce 端处理,因此需要Shuffle进行排序分区,减少跨节点数据传输的资源消耗。将数据完整的从map task端拉取数据到reduce task端
减少磁盘IO对task的影响。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐