MapReduce 运行全过程解析

国际新闻 浏览(825)

前言

之前我们讨论过MapReduce编程模型。我们知道他主要分为两个主要阶段来完成一项任务。一种是在地图阶段将数据与我们的数据分开,第二种是减少阶段。执行计算地图阶段的结果。摘要。

我还写了一个非常经典的WordCount代码,类似于Java中的HelloWorld。今天我们将使用此代码来说明整个MapReduce的操作。

我告诉你,这个知识点非常非常非常重要。在之前的五家公司中,有三家公司已经问过这个过程,另外两家公司已经问过Yarn的运营机制,这将在后面讨论。内容,你必须了解一般过程是如何,如果你可以研究找出每个细节,当然最好的。

从数据到处理程序到处理和输出到存储,整个过程分为以下五个阶段:

Input Split 或 Read 数据阶段输入拆分,它基于数据碎片和输入数据到处理程序中。读取与处理程序相反,数据从文件读入处理程序。此阶段表示我们的数据来自何处。这是整个过程的开始。Map阶段输入数据后,我们正在处理地图阶段。例如,划分一行的单词,然后将每个单词计为1以进行输出。Shuffle 阶段Shuffle阶段是整个MapReduce的核心,在Map阶段和Reduce阶段之间。 Spark中也有这个概念。可以说你了解这个概念。当你学习其他大数据计算框架原理时,它会为你带来很多帮助,因为他们的大多数想法都是一样的,下面将重点介绍解释这个过程。Reduce 阶段数据通过Map阶段处理,数据通过Shuffle阶段,最后到Reduce,相同键值的数据将在同一个Reduce任务中汇总。Output 阶段此阶段的事情是将Reduce阶段的计算结果存储在某个地方,这是整个过程的结束。

整个执行流程图

一张图片胜过千言万语:

如果我没有清楚地看到它,我在gayHub上传了一个完整的地址:

()

当然,我刚开始时,不知道或只是联系可能会更积极。让我们分开并解释每一件,最后理解它。

Input Split 数据阶段

输入Split Gu Mingsi,输入碎片,为什么我们调用输入碎片?因为在计算数据之前根据输入文件分割数据,因为我们需要分布式计算,所以我必须计算我想要切割的数据块数,然后我需要分配每个数据。处理任务。

每个输入切片对应于Map任务。输入切片不存储数据本身,而是存储切片长度和记录数据的位置数据,其通常与HDFS块相关联。

如果我们将每个HDFS的块大小设置为128M,如果我们现在有3个文件,大小为10M,129M,200M,则MapReduce将10M文件分成一个片段,129M数据文件分为2个片段,200M文件也分为两个分片。那么我们此时有5个分片,我们需要处理5个Map任务,数据仍然不均匀。

如果有很多小文件,那么将生成很多Map任务,并且处理效率非常低。

此阶段使用InputFormat组件,它是一个接口。默认是使用TextInputFormat来处理它。它将调用readRecord()来读取数据。

这也是MapReduce计算优化中非常重要的一点,**采访经过测试。如何优化这个小文件的问题?

最好的方法:在数据处理系统的最前端(预处理,采集),首先合并小文件,然后传输到HDFS。补救措施:如果HDFS中已存在大量小文件,则可以使用另一个InputFormat组件CombineFileInputFormat,它与TextInputFormat不同,后者在逻辑上将多个小文件计划到一个切片中。通过这种方式,可以将多个小文件移交给Map任务进行处理。

Map阶段

使用Map阶段的输出作为Reduce阶段的输入的过程是Shuffle。这也是整个MapReduce中最重要的部分。

通常,MapReduce处理大量数据。 Map输出数据不可能将所有数据都放入内存中。当我们在map函数中调用context.write()方法时,我们将调用OutputCollector组件来写入数据。在内存中称为环形缓冲区的东西。

环形缓冲区的默认大小为100M,但只有80%,并且映射将启动守护程序线程以进行输出操作。当数据达到80%时,守护程序线程开始清理数据并将数据写入磁盘。叫蜘蛛。

将数据写入环形缓冲区时,数据按默认值按键排序。每个分区的数据是顺序的。默认值为HashPartitioner。当然,我们也可以自定义这个分区器。

每次执行清理时,都会生成一个文件。执行映射时,将有一个合并文件文件的过程。实际上,它类似于Map阶段的输入分割。分区程序对应于减少作业。只有一个reduce操作,然后只有一个Partitioner。如果有多个reduce操作,则有多个Partitioner。分区程序的数量由密钥的值和减少的数量决定。可以通过job.setNumReduceTasks()设置。

还有一个可选组件Combiner。如果在溢出数据时调用Combiner组件,则其逻辑与reduce相同。如果合并不会更改业务,则相同的键首先添加值,因此您不粘贴它。通过从许多相同的密钥传输数据来提高效率。

例如,当溢出数据时,默认情况下不使用Combiner,数据长度如下:使用Combiner组件时,数据为: a的数据被合并。

Reduce 阶段

在执行Reduce之前,Reduce任务会将负责分区的数据提取到本地,并且还将执行合并排序和合并。

Reduce阶段中的reduce方法也是我们自己的实现逻辑,就像Map阶段中的map方法一样,除了执行reduce函数时,值是同一组键的值迭代器。在wordCount的示例中,我们迭代数据以进行叠加。最后,调用context.write函数输出单词和总计。

Output 阶段

在reduce函数中调用context.write函数时,将调用OutPutFomart组件。默认实现是TextOutPutFormat,它将数据输出到目标存储,通常是HDFS。

扩展

上面我们刚解释了一般过程,这里有几个问题适合每个人?也是面试中经常被问到的。

1.文档分割是如何切割的?一个文件到底会被削减一点?算法是什么样的?

2.如何确定Map任务的数量?

上面的问题,给大家贴两个链接:

MapReduce Input Split(输入分/切片)详解:

源码解析 MapReduce作业切片(Split)过程:

总结

这里基本上解释了MapReduce的执行流程,希望你能在上面画出大图。可以了解一般过程,并可以掌握Shuffle的关键链接。您将来会听到有关其他大数据组件的消息。

原文:

http://www.sugys.com/bdsSJzt