图文详解 MapReduce 工作流程_Shockang的博客-程序员宅基地

技术标签: mapreduce  大数据技术体系  大数据  

前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

在这里插入图片描述

MapReduce 编程模型

MapReduce 编程模型开发简单且功能强大,专门为并行处理大规模数据量而设计,接下来,通过一张图来描述 MapReduce 的工作过程,如图所示。

在这里插入图片描述

关于 MapReduce 编程模型的更多细节请参考我的这篇博客——MapReduce 编程模型到底是怎样的?

整体流程

在上图中, MapReduce 的工作流程大致可以分为5步,具体如下:
在这里插入图片描述

分片、格式化数据源

输入 Map 阶段的数据源,必须经过分片和格式化操作。

  • 分片操作:指的是将源文件划分为大小相等的小数据块( Hadoop 2.x 中默认 128MB ),也就是分片( split ),
    Hadoop 会为每一个分片构建一个 Map 任务,并由该任务运行自定义的 map() 函数,从而处理分片里的每一条记录;
  • 格式化操作:将划分好的分片( split )格式化为键值对<key,value>形式的数据,其中, key 代表偏移量, value 代表每一行内容。

执行 MapTask

每个 Map 任务都有一个内存缓冲区(缓冲区大小 100MB ),输入的分片( split )数据经过 Map 任务处理后的中间结果会写入内存缓冲区中。
如果写人的数据达到内存缓冲的阈值( 80MB ),会启动一个线程将内存中的溢出数据写入磁盘,同时不影响 Map 中间结果继续写入缓冲区。
在溢写过程中, MapReduce 框架会对 key 进行排序,如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写文件,如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。

执行 Shuffle 过程

MapReduce 工作过程中, Map 阶段处理的数据如何传递给 Reduce 阶段,这是 MapReduce 框架中关键的一个过程,这个过程叫作 Shuffle 。
Shuffle 会将 MapTask 输出的处理结果数据分发给 ReduceTask ,并在分发的过程中,对数据按 key 进行分区和排序。

执行 ReduceTask

输入 ReduceTask 的数据流是<key, {value list}>形式,用户可以自定义 reduce()方法进行逻辑处理,最终以<key, value>的形式输出。

写入文件

MapReduce 框架会自动把 ReduceTask 生成的<key, value>传入 OutputFormat 的 write 方法,实现文件的写入操作。

MapTask

在这里插入图片描述

  1. Read 阶段: MapTask 通过用户编写的 RecordReader ,从输入的 InputSplit 中解析出一个个 key / value 。
  2. Map 阶段:将解析出的 key / value 交给用户编写的 Map ()函数处理,并产生一系列新的 key / value 。
  3. Collect 阶段:在用户编写的 map() 函数中,数据处理完成后,一般会调用 outputCollector.collect() 输出结果,在该函数内部,它会将生成的 key / value 分片(通过调用 partitioner ),并写入一个环形内存缓冲区中(该缓冲区默认大小是 100MB )。
  4. Spill 阶段:即“溢写”,当缓冲区快要溢出时(默认达到缓冲区大小的 80 %),会在本地文件系统创建一个溢出文件,将该缓冲区的数据写入这个文件。

将数据写入本地磁盘前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
写入磁盘之前,线程会根据 ReduceTask 的数量,将数据分区,一个 Reduce 任务对应一个分区的数据。
这样做的目的是为了避免有些 Reduce 任务分配到大量数据,而有些 Reduce 任务分到很少的数据,甚至没有分到数据的尴尬局面。
如果此时设置了 Combiner ,将排序后的结果进行 Combine 操作,这样做的目的是尽可能少地执行数据写入磁盘的操作。

  1. Combine 阶段:当所有数据处理完成以后, MapTask 会对所有临时文件进行一次合并,以确保最终只会生成一个数据文件

合并的过程中会不断地进行排序和 Combine 操作,
其目的有两个:一是尽量减少每次写人磁盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。
最后合并成了一个已分区且已排序的文件。

ReduceTask

在这里插入图片描述

  1. Copy 阶段: Reduce 会从各个 MapTask 上远程复制一片数据(每个 MapTask 传来的数据都是有序的),并针对某一片数据,如果其大小超过一定國值,则写到磁盘上,否则直接放到内存中
  2. Merge 阶段:在远程复制数据的同时, ReduceTask 会启动两个后台线程,分别对内存和磁盘上的文件进行合并,以防止内存使用过多或者磁盘文件过多。
  3. Sort 阶段:用户编写 reduce() 方法输入数据是按 key 进行聚集的一组数据。

为了将 key 相同的数据聚在一起, Hadoop 采用了基于排序的策略。
由于各个 MapTask 已经实现对自己的处理结果进行了局部排序,因此, ReduceTask 只需对所有数据进行一次归并排序即可。

  1. Reduce 阶段:对排序后的键值对调用 reduce() 方法,键相等的键值对调用一次 reduce()方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到 HDFS 中
  2. Write 阶段: reduce() 函数将计算结果写到 HDFS 上。

合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce 会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到 Reduce 函数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Shockang/article/details/117970151

智能推荐

为WebForms说几句话,以及一些ASP.NET开发上的经验(1)_sunfollowme的博客-程序员宅基地

导读:   记得数年前,当ASP.NET刚出现时,天下间Web开发框架中似乎出现了一个“巨人”,WebForms这种似乎人人都能掌握的开发框架几乎瞬间流行起来。如果谁还在用传统ASP这种控制与表现混合的开发方式,似乎立即变得低俗了许多。于是乎许许多多人都学会了拖控件+绑定的方式,“Web开发人员”也越来越多,一片红火,好不热闹。   风水轮流转,不知从什么时候开始Rails框架随着RoR忽

oracle scn漏洞,Oracle安全:SCN可能最大值与耗尽问题Oracle安全:SCN可能最大值与耗尽问题..._实在知道什么的博客-程序员宅基地

SCN的问题一旦出现,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下,Oracle的SCN可能出现异常增长,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。我曾经在以下链接中描述过这个问题:Oracle使用6 Bytes记录SCN,也就是4...

GS-00001 : Failed to allocate 4592381952 bytes for sga_八戒涨价了的博客-程序员宅基地

GS-00001 : Failed to allocate 4592381952 bytes for sga在安装GaussDB 100,执行python install时发现如下错误:Error: Can not get instance '/opt/gaussdb/data' process pid,The detailed information: 'instance startup...

云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"..._weixin_30730151的博客-程序员宅基地

在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again”,网上一般说需要配置maxInMemorySize,自己测试发现,maxInMemorySize确实会影响结果,并且项目还跟写入文件到文件夹的transferTo(File dest)方法也有关系,...

linux下执行jar包,关闭窗口也不中断_Zzzz_zzzz_zz的博客-程序员宅基地_怎么启动jar包后关闭不断掉

要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下几种方式。一、java -jar XXX.jar这是最基本的jar包执行方式,但是当我们用ctrl+c中断或者关闭窗口时,程序也会中断执行。二、java -jar XXX.jar &amp;&amp;代表在后台运行,使用ctrl+c不会中断程序的运行,但是关闭窗口会中断程序的运行。三、no

php连hiveservice2,hiveServer2服务端安装_不过如此lee的博客-程序员宅基地

本文假设hive已经做了基础安装,基础配置参考《Hive安装》配置hive-site.xml启动HiveServer2还需要下面的设置hive.support.concurrencytruehive.zookeeper.quorume3basestorage1,e3basestorage2,e3basestorage3hive.zookeeper.client.port9501hive.zooke...

随便推点

linux执行命令在哪,linux执行命令在哪_李培智的博客-程序员宅基地

本文收集整理关于linux执行命令在哪的相关议题,使用内容导航快速到达。内容导航:linux6和7版本修改默认启动级别是不相同的,那么我们来说一说,怎么修改默认启动级别?linux6的修改方法,修改文件/etc/inittab里面的文件,修改成级别3,就可以直接进入命令行模式。linux7版本采用 targets 来定义运行级别,通过 vim /etc/inittab 可看到定义: 1 2 mul...

数学在计算机科学上的应用文献,计算机科学技术在数学中应用浅析_独角兽邹教授的博客-程序员宅基地

摘 要:人类社会文明的进步与发展过程中,数学在社会各领域中的应用越来越广泛,作用越来越大,已成为当代高新技术的重要组成部分。现代文明技术在计算机高度发展的今天,计算机科学技术在数学中应用越来越受到人们的关注。关键词:计算机科学技术;数学;应用在现代科学技术领域中,随着计算机的诞生和日益普及,教育教学也在不断发展,因此教育技术也有了翻天覆地的变化。计算机科学技术把教学媒体与传统教育相结合,不但深化教...

直播实录 | AlphaGo Zero是如何实现无师自通的?_PaperWeekly的博客-程序员宅基地

本文为 10 月 29 日,圣何塞州立大学——刘遥行的论文共读直播分享实录。Google DeepMind 团队在 Nature 上发表的最新论文,阐述了新版 AlphaGo 是如何从空白状态学起,不使用任何人类棋谱,通过自对弈强化学习,仅用 3 天训练时间就以 100:0 击败了上一版本的 AlphaGo,并用 21 天达到 AlphaGo Master 水平。A

【为项目添加日志】logging格式输出:日志发生的时间、模块、行号等信息格式输出_小慌慌的博客-程序员宅基地_logger格式化输出

前言一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210421。7、为项目添加日志logging模块介绍 logging格式输出 为项目添加log日志logging.basicConfig()函数说明logging模块的格式字符串实例1:import loggingmy_format='%(asctime)s-%(filename)s-%(module)s-%(lineno)d'# 输出的格式内容logging.basi..

mfc服务器发送信息失败10057,基于MFC的局域网聊天工具.doc_螺旋真理的博客-程序员宅基地

本科毕业论文基于MFC的局域网聊天工具Instant Messaging of LAN Based on MFC姓名:学号:院系:指导教师:摘要关键字:局域网;即时通讯;Win32;API;MFC;SOCKET;多线程AbstractKeywords: LAN; Instant Messaging(IM); MutiThread; Win32; API; MFC; SOCKET目录第一章 引言- ...

Django 定义属性总结_louis_bupt的博客-程序员宅基地

本文从网上搜集了一些 Django 定义属性的知识并进行整理,大家可以及时收藏方便随时查看。内容包括概述、库、逻辑删除、字段类型、字段选项、关系

推荐文章

热门文章

相关标签