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,Shuffle,reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交:2. Map阶段&…...

【JVM基础篇】Java垃圾回收器介绍
垃圾回收器(垃圾回收算法实现) 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代,除了G1(既能管控新生代,也可以管控老年代)之外,新生代、老年代的垃圾回收器必须按照ho…...

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

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

一文清晰了解CSS——简单实例
首先一个小技巧: 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括: 类选择器:以.开头,用于选择具…...
工程师 - 什么是XML文件
XML(eXtensible Markup Language,扩展标记语言)文件是一种使用自定义标签来定义对象及其内部数据的纯文本文件。XML设计的目的是既易于人类阅读又易于机器解析,因此它在不同系统和应用之间传输和存储数据时非常有用。 XML的主要特…...

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

关于无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上 解决方法
文章目录 1. ERNEL32.dll 下载2. 解决方法 👍 个人网站:【 洛秋小站】 1. ERNEL32.dll 下载 Windows 7 在安装postman时报错缺少动态链接库,提示缺少.NET Framework,这是因为本地缺少相应的dll文件导致的,这时就需要下载ERNEL32.dll文件,在解…...

轻松创建对象——简单工厂模式(Java实现)
1. 引言 大家好,又见面了!在上一篇文章中,我们通过Python示例介绍了简单工厂模式,今天,我们继续深入这个话题,用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式(Simple Facto…...
Docker Dockerfile:构建与优化
Docker Dockerfile:构建与优化 简介 Docker 是一种广泛使用的容器化技术,它允许开发人员将应用程序及其依赖环境打包到一个可移植的容器中。Dockerfile 是 Docker 中用于自动化容器镜像构建的脚本文件。本文将详细介绍 Dockerfile 的基本结构、指令使用…...
开源项目有哪些机遇与挑战?
随着全球经济和科技环境的快速变化,开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目,以推动技术创新和实现协作共赢。本文将从开源项目的发展趋势、参与开源的经验分享以及开源项目的挑战三个方面进行探讨。…...

利用【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…...

数学建模美赛经验小结
图片资料来自网络所听讲座,感谢分享!...
206. 反转链表 (Swift 版本)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 解题 /*** Definition for singly-linked list.* public class ListNode {* public var val: Int* public var next: ListNode?* public init() { self.val 0; self.…...

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

14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B
利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展,LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而,这些模型的庞大规模给其部署和实际使用带来了巨大挑战,尤其是在资源受限的设备上,例如内存…...
风景园林工程设计乙级资质业绩要求案例分析
项目数量与规模 数量要求:企业需要提供一定数量的已完成风景园林设计项目案例,这个数量可能依据具体政策而有所不同,但通常需要完成多个项目以展示设计团队的综合能力。 规模要求:项目规模需达到乙级资质标准所规定的级别&#…...

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

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 //更…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...