当前位置: 首页 > news >正文

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文件中。

相关文章:

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

系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map&#xff0c;Shuffle&#xff0c;reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交&#xff1a;2. Map阶段&…...

【JVM基础篇】Java垃圾回收器介绍

垃圾回收器&#xff08;垃圾回收算法实现&#xff09; 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1&#xff08;既能管控新生代&#xff0c;也可以管控老年代&#xff09;之外&#xff0c;新生代、老年代的垃圾回收器必须按照ho…...

java通过poi-tl导出word实战详细步骤

文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让…...

将自签证书添加到Java的可信任证书列表中

文章目录 前言将自签证书添加到Java的可信任证书列表中添加到Java的可信任证书列表中 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…...

一文清晰了解CSS——简单实例

首先一个小技巧&#xff1a; 一定要学会的vsCode格式化整理代码的快捷键&#xff0c;再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括&#xff1a; 类选择器&#xff1a;以.开头&#xff0c;用于选择具…...

工程师 - 什么是XML文件

XML&#xff08;eXtensible Markup Language&#xff0c;扩展标记语言&#xff09;文件是一种使用自定义标签来定义对象及其内部数据的纯文本文件。XML设计的目的是既易于人类阅读又易于机器解析&#xff0c;因此它在不同系统和应用之间传输和存储数据时非常有用。 XML的主要特…...

[AI 大模型] 阿里巴巴 通义千问

文章目录 [AI 大模型] 阿里巴巴 通义千问简介模型架构发展新技术和优势示例 [AI 大模型] 阿里巴巴 通义千问 简介 阿里巴巴的 通义千问 是由阿里云开发的一款大型语言模型&#xff0c;旨在为用户提供高效、智能的自然语言处理服务。 通义千问能够处理多种语言输入&#xff0c…...

关于无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上 解决方法

文章目录 1. ERNEL32.dll 下载2. 解决方法 &#x1f44d; 个人网站:【 洛秋小站】 1. ERNEL32.dll 下载 Windows 7 在安装postman时报错缺少动态链接库,提示缺少.NET Framework,这是因为本地缺少相应的dll文件导致的&#xff0c;这时就需要下载ERNEL32.dll文件&#xff0c;在解…...

轻松创建对象——简单工厂模式(Java实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;在上一篇文章中&#xff0c;我们通过Python示例介绍了简单工厂模式&#xff0c;今天&#xff0c;我们继续深入这个话题&#xff0c;用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式&#xff08;Simple Facto…...

Docker Dockerfile:构建与优化

Docker Dockerfile&#xff1a;构建与优化 简介 Docker 是一种广泛使用的容器化技术&#xff0c;它允许开发人员将应用程序及其依赖环境打包到一个可移植的容器中。Dockerfile 是 Docker 中用于自动化容器镜像构建的脚本文件。本文将详细介绍 Dockerfile 的基本结构、指令使用…...

开源项目有哪些机遇与挑战?

随着全球经济和科技环境的快速变化&#xff0c;开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目&#xff0c;以推动技术创新和实现协作共赢。本文将从开源项目的发展趋势、参与开源的经验分享以及开源项目的挑战三个方面进行探讨。…...

利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案

目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…...

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上运行spark程序写到本地文件的时候报错。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()错误信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…...

数学建模美赛经验小结

图片资料来自网络所听讲座&#xff0c;感谢分享&#xff01;...

206. 反转链表 (Swift 版本)

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 解题 /*** Definition for singly-linked list.* public class ListNode {* public var val: Int* public var next: ListNode?* public init() { self.val 0; self.…...

海狐外卖O2O商城系统:技术架构与运营模式的深度解析

摘要&#xff1a; 本文深入探讨了海狐外卖O2O商城系统的技术架构、功能特性以及运营模式。海狐外卖作为一款专注于细分市场领域的外卖餐饮解决方案&#xff0c;不仅拥有先进的技术栈支持&#xff0c;还通过丰富的系统插件和灵活的运营模式&#xff0c;为商户和用户提供高效、便…...

14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B

利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展&#xff0c;LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而&#xff0c;这些模型的庞大规模给其部署和实际使用带来了巨大挑战&#xff0c;尤其是在资源受限的设备上&#xff0c;例如内存…...

风景园林工程设计乙级资质业绩要求案例分析

项目数量与规模 数量要求&#xff1a;企业需要提供一定数量的已完成风景园林设计项目案例&#xff0c;这个数量可能依据具体政策而有所不同&#xff0c;但通常需要完成多个项目以展示设计团队的综合能力。 规模要求&#xff1a;项目规模需达到乙级资质标准所规定的级别&#…...

无人机之飞行规划与管理篇

无人机飞行规划与管理是确保无人机安全、高效且符合法规的运行的关键步骤。这一过程包括了对飞行任务的详细安排、航线的设定以及风险的评估和管理。下面简述这一过程的主要环节&#xff1a; 一、飞行目的和任务确定 在规划之初&#xff0c;必须明确无人机的飞行目的&#xf…...

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…...

深度学习中的正则化技术 - 数据集增强篇

序言 在机器学习与深度学习的广阔领域中&#xff0c;数据集的质量与规模往往是决定模型性能的关键因素之一。然而&#xff0c;现实世界中高质量、标注完善的数据集往往稀缺且获取成本高昂&#xff0c;这成为了制约算法进步的一大瓶颈。为了缓解这一问题&#xff0c;数据集增强…...

【Docker系列】Docker 镜像源:优化你的容器化开发流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【Linux】Windows环境下配置虚拟机静态IP

当前我们虚拟机的Linux操作系统&#xff0c;其IP地址是通过DHCP服务获取的。 DHCP:动态获取IP地址&#xff0c;即每闪重启设备后都会获取一次&#xff0c;可能导致IP地址频繁变更 原因1&#xff1a;办公电脑IP地址变化无所谓&#xff0c;但是我们要远程连接到Linux系统&#x…...

完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法,亲测有效!!!

完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决AttributeError: ‘list‘ object has no attribute ‘shape‘的正确解决方法&#xff0c;亲测有效&#xff0…...

链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期” 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 出现如下问题: 与链接服务器的测试连接失败。执行Transact-SQL 语句或批处理时发生了异常。命名管道提供程序:无法打开与SQL SERVER的链接[53]链接服务器“XX”的OLEDB访问接口“MSOLEDBSQL”返回了消息“登录超时已过期…...

【AI伦理与社会责任】讨论人工智能在隐私保护、偏见消除、自动化对就业的影响等伦理和社会问题。

人工智能&#xff08;AI&#xff09;作为第四次产业革命的核心技术&#xff0c;在推动社会进步和经济发展的同时&#xff0c;也引发了一系列伦理和社会问题。以下从隐私保护、偏见消除以及自动化对就业的影响三个方面进行详细讨论。 一、隐私保护 人工智能技术的广泛应用涉及…...

Qt编程技巧小知识点(1)TCP缓存区数据读取

文章目录 Qt编程技巧小知识点&#xff08;1&#xff09;TCP缓存区数据读取小结 Qt编程技巧小知识点&#xff08;1&#xff09;TCP缓存区数据读取 TCP的socket对内存进行读取&#xff08;使用socket->readall()&#xff09;的时候输出的内容有时会进行局部倒置&#xff0c;其…...

vue 搭建 pinia

文章目录 环境设置存储读取数据【 storeToRefs】借助storeToRefs将store中的数据转为ref对象&#xff0c;方便在模板中使用【getters】当state中的数据&#xff0c;需要经过处理后再使用时&#xff0c;可以使用getters配置【$subscribe】通过 store 的 $subscribe() 方法侦听 s…...

什么是CLR

CLR&#xff0c;全称为Common Language Runtime&#xff0c;即公共语言运行时&#xff0c;是微软为.NET产品构建的运行环境&#xff0c;与Java的JVM&#xff08;Java虚拟机&#xff09;类似&#xff0c;可以看作是.NET的虚拟机。CLR的主要作用和特点如下&#xff1a; 主要作用…...

Spring MVC -01

Spring 的 MVC 框架 Spring的MVC框架是Spring框架的一部分&#xff0c;它提供了用于开发Web应用程序的一组组件和设计模式。MVC是Model-View-Controller的缩写&#xff0c;是一种设计模式&#xff0c;用于将应用程序的逻辑与用户界面分离。 在Spring的MVC框架中&#xff0c;Mo…...

鹿泉市建设局网站/营销运营主要做什么

随着人工智能技术的不断发展&#xff0c;以ChatGPT为代表的颠覆性AI应用破圈&#xff0c;标志着人工智能领域的重大突破&#xff0c;引发全球共振。不少人将ChatGPT的问世比喻为“蒸汽机”&#xff0c;人工智能就此走向“工业时代”。 ChatGPT相较于之前市面上的所有同类产品&a…...

网站开发前台开发/小程序拉新推广平台

项目介绍 随着人们生活水平的逐步提高&#xff0c;旅游成了大家必不可少放松项目&#xff0c;每当笔者走到一个美丽的景点&#xff0c;就会忍不住拿起数码相机照上几张留做回忆。虽然照片最后会存入到自己的电脑里&#xff0c;但是时间一长、照片一多&#xff0c;这些有着勾起…...

深圳做网站价比高的公司性/怎么样在百度上推广自己的产品

1、jQuery 的属性操作 jQuery 属性操作&#xff1a; html() 它可以设置和获取起始标签和结束标签中的内容。跟dom 属性innerHTML 一样。 text() 它可以设置和获取起始标签和结束标签中的文本。跟dom 属性innerText 一样。 val() 它可以设置和获取表单项的value 属性值。跟dom 属…...

上海崇明网站建设/企业建站用什么好

一、Struts1.x 1.<html:link action"/action">不用关心Web应用程序的路径和ActionServlet的映射关系。 可以自动附加sessionid参数进行url重写。 可以对参数信息进行url编码。 备注&#xff1a;<c:url>标准标签也有<html:link>标签的后两个功能。 …...

做科学小制作的视频网站/外贸做网站公司哪家好

学习了函数之后&#xff0c;就要考虑变量与作用域了&#xff0c;只有清楚变量的作用范围&#xff0c;代码逻辑才不会乱&#xff0c;变量的作用域分为全局变量和局部变量&#xff0c;全局变量是从赋值后&#xff0c;后续的代码都可以用该变量&#xff0c;局部变量是只有在函数内…...

武汉网站设计价格/各大网址收录查询

当你在使用 Lombok 的 Data 注解时&#xff0c;其实会有一些坑需要关注&#xff0c;今天就让我们来见识一下。Lombok先来简单介绍一下 Lombok &#xff0c;其官方介绍如下&#xff1a;Project Lombok makes java a spicier language by adding handlers that know how to build…...