MapReduce底层原理详解:大案例解析(第32天)

系列文章目录

一、MapReduce概述
二、MapReduce工作机制
三、Map,Shuffle,reduce阶段详解
四、大案例解析


文章目录

  • 系列文章目录
  • 前言
  • 一、MapReduce概述
  • 二、MapReduce工作机制
    • 1. 角色与组件
    • 2. 作业提交与执行流程
      • 1. 作业提交:
      • 2. Map阶段:
      • 3. Shuffle阶段:
      • 4. Merge阶段:将所有溢出的临时文件合并成一个文件。
      • 5. Reduce阶段:
  • 三、Map阶段详解
    • 1. 数据分片(Split)
    • 2. Map函数执行
  • 四、Shuffle阶段详解
    • 1. Collect阶段
    • 2. Spill阶段
    • 3. Merge阶段
  • 五、大案例解析
    • 1. 单词统计流程
    • 2. MR底层原理图解析
      • 2.1 map阶段流程
      • 2.2 shuffle阶段流程
      • 2.3 reduce阶段流程


前言

MapReduce(简称MR)是Hadoop框架中的一个核心组件,它主要用于大规模数据集的并行处理。MapReduce的底层原理涉及数据的分片、Map阶段的处理、Shuffle过程以及Reduce阶段的处理等多个环节。本文通过案例解析方式对MR底层原理进行详细解析


一、MapReduce概述

MapReduce是一种编程模型和相关的实现,用于大规模数据集(大于1TB)的并行运算。它由Google在2004年提出,随后Apache Hadoop项目实现了MapReduce的开源版本。MapReduce将复杂的运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。Map函数处理输入数据并产生中间键值对,Reduce函数则对中间键值对进行合并以产生最终结果。

二、MapReduce工作机制

1. 角色与组件

MapReduce作业的执行涉及多个角色和组件,主要包括:

Client:提交MapReduce作业的客户端。
ResourceManager(RM):负责集群资源的统一管理和调度。
NodeManager(NM):负责节点上的资源管理和使用,并定时向RM汇报资源使用情况。
ApplicationMaster(AM):每个作业都会有一个AM,负责应用程序的管理,包括资源的请求、任务的分配和监控等。
HDFS:Hadoop分布式文件系统,用于存储作业的输入数据和输出数据。

2. 作业提交与执行流程

1. 作业提交:

Client将作业提交给ResourceManager。
ResourceManager中的Scheduler为作业分配资源,并启动ApplicationMaster。
ApplicationMaster根据作业需求向ResourceManager申请资源,并启动MapTask和ReduceTask。

2. Map阶段:

MapTask从HDFS读取输入数据(以split为单位)。
每个MapTask处理一个split,将其中的数据转换为键值对(Key/Value)。
对每个键值对执行Map函数,输出中间结果(也是键值对形式)。
中间结果会暂时存储在本地磁盘的环形缓冲区中,当缓冲区满或Map任务完成时,会将数据写入HDFS中的临时目录。

3. Shuffle阶段:

Shuffle是MapReduce的核心过程之一,它负责将Map任务的输出作为Reduce任务的输入。
Shuffle过程包括Collect、Spill、Merge、Copy和Sort等阶段。
Collect阶段:MapTask将结果输出到环形缓冲区。
Spill阶段:当缓冲区满时,将数据写入本地磁盘,并进行排序和合并。

4. Merge阶段:将所有溢出的临时文件合并成一个文件。

Copy阶段:ReduceTask启动Fetcher线程从MapTask所在节点复制属于自己的数据。
Sort阶段:ReduceTask对复制过来的数据进行排序,确保每个key对应的value值都排在一起。

5. Reduce阶段:

ReduceTask从Shuffle阶段获取到排序后的数据。
对每个key及其对应的value列表执行Reduce函数,生成最终结果。
将最终结果写入HDFS。

三、Map阶段详解

1. 数据分片(Split)

输入源:MapReduce作业通常以HDFS上的文件作为输入源,但也可以有其他输入源。
文件分片:HDFS上的文件被逻辑上划分为多个分片(split),每个split包含一个或多个block(块),默认是一对一的关系。split不包含具体数据,只包含数据的位置信息。
分片大小:分片大小通常等于HDFS的block大小(默认128MB),但可以通过配置参数进行调整。

2. Map函数执行

输入:Map函数以split中的数据作为输入,数据被转换为键值对形式。对于HDFS文件,键通常是数据的偏移量,值是数据本身。
处理:用户自定义的Map函数对每个键值对进行处理,并输出中间结果(也是键值对形式)。
输出:中间结果被写入到本地磁盘的环形缓冲区中,当缓冲区满或Map任务完成时,会被写入HDFS中的临时目录。

四、Shuffle阶段详解

Shuffle阶段是MapReduce作业中最复杂也是最关键的过程之一,它负责将Map任务的输出数据整理并传递给Reduce任务。

1. Collect阶段

MapTask将处理后的数据写入到环形缓冲区中,同时保存分区信息和序列化后的键值对数据。

2. Spill阶段

当环形缓冲区中的数据量达到一定的阈值(如80%满)时,会触发Spill操作。
Spill操作将缓冲区中的数据排序并写入到本地磁盘的临时文件中。如果配置了Combiner,还会对相同分区和key的数据进行合并。

3. Merge阶段

当MapTask完成后,会将所有溢出的临时文件合并成一个大的文件。
合并

五、大案例解析

1. 单词统计流程

已知文件内容:

    hadoop hive hadoop spark hive flink hive linux hive mysqlinput结果: k1(行偏移量)   v1(每行文本内容)0   		 hadoop hive hadoop spark hive 30   		 flink hive linux hive mysql
map结果:k2(split切割后的单词)  v2(拼接1)     hadoop  			 1hive   				 1hadoop  			 1spark  				 1hive   				 1flink  				 1hive   				 1linu  				 1hive   				 1mysql  				 1
分区/排序/规约/分组结果:k2(排序分组后的单词)   v2(每个单词数量的集合)flink   		    [1]hadoop  			[1,1]hive    			[1,1,1,1]linux   			[1] mysql   			[1]spark   			[1]
reduce结果:k3(排序分组后的单词)   v3(聚合后的单词数量)flink 				 1hadoop 				 2hive   				 4linux  				 1mysql  				 1spark  				 1
output结果:   注意: 输出目录一定不要存在,否则报错flink   1hadoop  2hive    4linux   1mysql   1spark   1

2. MR底层原理图解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 map阶段流程

第一阶段是把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认情况下Split size 等于 Block size。每一个切片由一个MapTask处理(当然也可以通过参数单独修改split大小)
第二阶段是对切片中的数据按照一定的规则解析成对。默认规则是把每一行文本内容解析成键值对。key是每一行的起始位置(单位是字节),value是本行的文本内容。(TextInputFormat)
第三阶段是调用Mapper类中的map方法。上阶段中每解析出来的一个,调用一次map方法。每次调用map方法会输出零个或多个键值对
第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务
第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。
如果有第六阶段,那么进入第六阶段;如果没有,直接输出到文件中
第六阶段是对数据进行局部聚合处理,也就是combiner处理。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。本阶段默认是没有的。

2.2 shuffle阶段流程

shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等
Spill阶段:当内存中的数据量达到一定的阀值(80%)的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。 

1- map端为什么需要将溢写得到的多个小的磁盘文件合并为最终的一个大的磁盘文件?

答:

​ 1- 小文件和大的文件存储的内容都是一样,但是多个小文件占用的存储空间比大文件要多一些

​ 2- (核心原因)文件在操作的时候,底层需要进行磁盘IO(https://zhuanlan.zhihu.com/p/443657373)。如果小文件过多,磁盘IO需要进行比较长的时间。
在这里插入图片描述
2- 为什么map端将数据写入磁盘的时候,还需要对数据进行sort,也就是局部排序?

答:因为reduce需要去map端读取数据。如果对数据排序了,那么reduce读取数据的速度相对比没排序的要快。

在这里插入图片描述

2.3 reduce阶段流程

第一阶段是Reducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此Reducer会复制多个Mapper的输出。第二阶段是把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。该排序是在reduce端进行的,进行排序是为了提升reduce对数据的处理速度。第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/374243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux_进程概念——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

Firealpaca 解锁版下载及安装教程 (火焰羊驼绘画软件)

前言 FireAlpaca是一款简单易用的电脑绘画软件&#xff0c;采用了类似于Photoshop的图层绘画方式。对于喜欢手绘和创作漫画的朋友来说&#xff0c;FireAlpaca的多图层功能使得绘画过程更加便捷和简单。作为一个小型图像编辑软件&#xff0c;它能够轻松处理多个图层或手绘图&am…

网络编程的学习之udp

Udp编程过程 Sento不会阻塞 实现聊天室效果 上线 聊天 下线 服务端需要一个地址&#xff0c;去保留名字和ip地址 交互的时候发结构体 下面这个宏只能在c语言里使用 ser.sin_port htons(50000); 上面是端口号50000以上&#xff0c;两边要一样 这里是不要让udp发的太快&am…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

Java 快速入门学习 -- Day 1

Java 快速入门 Ⅰ 学习视频快捷键封装继承方法的重写多态异常I/O 流多线程网络编程 -- 单向通信XML注解navicat mysqlJDBC查询数据库中所有元素并打印 ) 学习视频 【3天搞定JavaSE到SpringBoot框架】 快捷键 // psvm 回车 public static void main(String[] args) {}// s…

【动态规划Ⅳ】二维数组的动态规划——最小路径和

二维数组的动态规划 最小路径和64. 最小路径和原地修改数组定义二维数组进行状态转移优化&#xff1a;用 一维数组进行状态转移相似题目&#xff1a;LCR 166. 珠宝的最高价值 120. 三角形最小路径和原地修改数组定义二维数组进行状态转移一维数组进行状态转移自底向上&#xff…

推荐一个比 Jenkins 使用更简单的项目构建和部署工具

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 项目介绍 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解…

【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化

【R语言Gephi】利用R语言和Gephi实现共发生网络的可视化 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 一 概述 Gephi是一款开源免费的多平台网络分析软件&#xff0c;在Windows、Linux和Mac os上均可以运行&#xff0c;像他们官网所说的&#xff0c;他们致力于…

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件&#xff1a;在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

安装nodejs | npm报错

nodejs安装步骤: 官网&#xff1a;https://nodejs.org/en/ 在官网下载nodejs: 双击下载下来的msi安装包&#xff0c;一直点next&#xff0c;我选的安装目录是默认的: 测试是否安装成功&#xff1a; 输入cmd打开命令提示符&#xff0c;输入node -v可以看到版本&#xff0c;说…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

E. Beautiful Array(cf954div3)

题意&#xff1a;给定一个数组&#xff0c;可以先对数组进行任意排序&#xff0c;每次操作可以选择一个ai&#xff0c;将它变成aik&#xff0c; 想让这个数组变成一个美丽数组&#xff08;回文数组&#xff09;&#xff0c;求最少操作次数 分析&#xff1a; 先找出相同的数字…

使用Docker制作python项目镜像

各docker桌面版本集合&#xff1a;如果提示新版本系统不支持&#xff0c;可下载旧版本 我也分享在下面。 链接: https://pan.baidu.com/s/1HvaO2wOIE3pNE0bM7Qm3sA?pwdg7ky 提取码: g7ky –来自百度网盘超级会员v2的分享 来源参考&#xff1a;https://zhuanlan.zhihu.com/p/65…

【Linux】命令执行的判断依据:;,,||

在某些情况下&#xff0c;很多命令我想要一次输入去执行&#xff0c;而不想要分次执行时&#xff0c;该如何是好&#xff1f; 基本上有两个选择&#xff0c; 一个是通过shell脚本脚本去执行&#xff0c;一种则是通过下面的介绍来一次入多个命令。 1.cmd&#xff1a;cmd&#…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…