大数据Hadoop中MapReduce的介绍包括编程模型、工作原理(MapReduce、MapTask、ReduceTask、Shuffle工作原理)

news2025/1/23 15:25:10

MapReduce概述

MapReduce是Hadoop的核心项目之一,它是一个分布式计算框架, 可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算,是大数据中较为熟知的分布式计算框架。

MapReduce作为分布式计算框架,其底层思想采用的是“分而治之”,所谓的“分而治之”就是把一个复杂的问题,按照一定的规则分为若干个没有依赖关系的简单问题,然后逐个解决这些简单问题,把若干个简单问题的结果组成整个复杂问题的最终结果。

为了更好地理解“分而治之”的思想,先通过一个生活中的例子进行介绍。例如,某停车场管理人员要统计一个大型停车场的停车数量,在车辆停车后不再挪动的情况下,将大型停车场划分为不同的停车区域,然后针对划分的每个区域单独进行统计,最后将每个区域的停车数量累加在一起。

在这里插入图片描述

MapReduce计算海量数据时,每个MapReduce程序被初始化为一个工作任务,这个工作任务在运行时会经历Map过程和Reduce过程。

Map过程:负责将工作任务分解为若干个相互独立的子任务,这些子任务相互独立,可以单独被执行。

Reduce过程:负责将Map过程处理完的子任务结果合并,从而得到工作任务的最终结果。

MapReduce的执行过程
在这里插入图片描述

MapReduce编程模型

MapReduce是一种编程模型,用于处理大规模数据集的并行计算。使用MapReduce执行处理大规模数据集计算任务的时候,计算任务主要经历两个过程,分别是Map过程和Reduce过程,其中Map过程用于对原始数据进行处理;Reduce过程用于对Map过程处理后的数据进行汇总,得到最终结果。

在这里插入图片描述

MapReduce的编程模型借鉴了计算机程序设计语言LISt Processing(LISP)的设计思想,提供了map()和reduce()这两个方法分别用于Map过程和Reduce过程:

  • map()方法接收格式为键值对(<Key,Value>)的数据,其中键(Key)是指每行数据的起始偏移量,也就是每行数据开头的字符所在的位置,值(Value)是指文本文件中的每行数据。使用map()方法处理后的数据,会被映射为新的键值对作为reduce()方法的输入;
  • reduce()方法默认会将每个键值对中键相同的值进行合并,当然也可以根据实际需求调整合并规则。

MapReduce简易模型的数据处理过程:

在这里插入图片描述

(1)MapReduce通过特定的规则将原始数据解析成键值对<Key1,Value1>的形式。

(2)解析后的键值对<Key1,Value1>会作为map()方法的输入,map()方法根据映射规则将<Key1,Value1>映射为新的键值对<Key2,Value2>。

(3)新的键值对<Key2,Value2>作为reduce()方法的输入,reduce()方法将具有相同键的值合并在一起,生成最终的键值对<Key3,Value3>。

在MapReduce中,对于一些数据的计算可能不需要Reduce过程,也就是说MapReduce的简易模型的数据处理过程可能只有Map过程,由Map过程处理后的数据直接输出到目标文件。但是,对于大多数数据的计算来说,都是需要Reduce过程的,并且由于数据计算繁琐,需要设定多个Reduce过程。
在这里插入图片描述
上图展示的是含有3个Map过程和2个Reduce过程的MapReduce模型,其中,由3个Map过程处理后的键值对会根据分区规则输出到不同的Reduce过程进行处理,默认情况下,分区规则是根据Map过程输出的键值对中的键的哈希值决定的。Reduce过程是最后的处理过程,其输出结果不会进行第二次合并,也就是说,不同的Reduce过程都会将处理结果输出到单独的目标文件。

为了更好地理解MapReduce编程模型,接下来,通过一个经典案例——词频统计来帮助加深对MapReduce的理解。

假设有两个文本文件test1.txt和文件test2.txt。

文件test1.txt的内容

Hello World

Hello Hadoop

Hello CHQ

文件test2.txt的内容

Hadoop MapReduce

MapReduce Spark

使用MapReduce程序统计文件test1.txt和test2.txt中每个单词出现的次数,实现词频统计的流程。

在这里插入图片描述

MapReduce工作原理

1.MapReduce工作过程

MapReduce编程模型开发简单且功能强大,专门为并行处理大规模数据量而设计。

在这里插入图片描述
上图可以看出,在MapReduce中的MapTask是实现Map过程的多个任务,ReduceTask是实现Reduce过程的任务。MapReduce的工作过程大致可以分为以下4步。

1.分片(Split)和解析原始数据

输入MapTask的原始数据必须经过分片和解析操作。分片和解析操作说明如下:

  • **分片操作:**指将原始数据文件file划分为多个数据块,每个数据块默认是128MB,即block1、block2和block3,MapReduce会为每个数据块创建一个MapTask,并且该MapTask运行的map()方法,处理数据块内的每行数据。
  • **解析操作:**将数据块内的每行数据映射为键值对的形式,其中,键表示数据块中每行数据的起始偏移量,值表示数据块中的每行数据。

2.执行MapTask

每个MapTask都有一个内存缓冲区,默认缓冲区的100MB,输入的键值对经过MapTask处理后,会将中间结果暂时写入内存缓冲区。如果写入的数据达到内存缓冲区的阈值,默认为80MB,则会启动一个线程,将内存缓冲区的数据写入磁盘,形成临时文件,数据在写入磁盘之前会进行分区和排序操作。如果MapTask产生的中间结果比较大,则会形成多个临时文件。当MapTask结束后,内存缓冲区中的数据也会写入磁盘而形成临时文件,此时多个临时文件会合并为一个文件,该文件中存放了MapTask的处理结果。

3.执行ReduceTask

每个MapTask的处理结果会根据分区规则被分配到对应的ReduceTask进行处理,ReduceTask,通过运行的reduce()方法进行逻辑处理,得到最终的键值对并输出。

4.输出数据

MapReduce会自动把每个ReduceTask的处理结果以键值对的形式写入指定目录(dictionary)的文件,即part-0,part-1和part-2。

2.MapTask工作原理

MapTask实现过程大致分为Read阶段、Map阶段、Collect阶段、Spill阶段和Combine阶段。

在这里插入图片描述

1.Read阶段:通过MapReduce内置的InputFormat组件将读取的文件进行分片处理,将每个数据块中的数据映射为键值对形式。

2.Map阶段:根据实际应用场景自定义map()方法,将Read阶段映射的键值对进行转换,并生成一系列新的键值对。

3.Collect阶段:将Map阶段输出的键值对写入内存缓冲区(Memory Buffer)。

4.Spill阶段:判断内存缓冲区中的数据是否达到指定阈值。当数据达到指定阈值时,会将内存缓冲区中的数据写入本地磁盘(Disk),形成临时文件。内存缓冲区中的数据在写入磁盘之前会进行分区和排序处理,每个分区会形成一个单独的临时文件。

5.Combine阶段:将写入本地磁盘的所有临时文件合并(Merge)成一个新的文件,对新文件进行归并排序。

3.ReduceTask工作原理

ReduceTask的工作过程主要经历Copy阶段、Merge阶段、Reduce阶段和Write阶段。

在这里插入图片描述

1.Copy阶段:从不同的MapTask复制需要处理的数据,将数据写入内存缓冲区。

2.Merge阶段:判断内存缓冲区中的数据是否达到指定阈值。当数据达到指定阈值时,会将内存缓冲区中不同MapTask获取的数据合并,合并的同时会进行排序操作,合并的结果会写入本地磁盘,形成临时文件。在合并的过程中,在本地磁盘还会产生多个临时文件,多个临时文件在传输到Reduce阶段之前会再进行一次合并和排序操作。

3.Reduce阶段:根据实际应用场景自定义reduce()方法,对Merge阶段输出的键值对进行处理。Merge阶段以组的形式将数据传输到Reduce阶段,每组数据中键值对的键相同,每组数据会调用一次reduce()方法进行处理,并生成新的键值对。

4.Write阶段:将Reduce阶段生成的新键值对输出,例如HDFS。

4.Shuffle工作原理

Shuffle是MapReduce的核心,它用来确保每个ReduceTask的输入数据都是按键排序的。它的性能高低直接决定了整个MapReduce程序的性能高低。

在这里插入图片描述
由上图可知,MapTask和ReduceTask都涉及Shuffle。

1.MapTask中的Shuffle

MapTask中的Shuffle是从Collect阶段到Combine阶段,介绍如下。

(1)MapTask处理的结果会暂时放入一个内存缓冲区,该缓冲区的默认大小是100MB,当缓冲区中的数据达到80%,即80MB时,会在本地文件系统创建一个临时文件,将内存缓冲区中的数据写入这个文件。
(2)写入磁盘之前MapReduce会根据ReduceTask的数量将数据分区,一个ReduceTask对应一个分区,这样做是为了避免有些ReduceTask分配到大量数据,而有些ReduceTask分配到很少的数据,甚至没有分配到数据的现象。
(3)对每个分区的数据进行排序,如果此时设置了Combiner,则会对排序后的结果进行合并,这样做的目的是尽可能减少写入磁盘的数据。
(4)当MapTask结束时可能有很多临时文件,这时需要将这些临时文件合并成一个已分区且已排序的文件,目的是减少ReduceTask的Copy阶段复制数据的数据量
(5)将分区中的数据输出到对应的ReduceTask。

2.ReduceTask中的Shuffle

ReduceTask中的Shuffle是从Copy阶段到Sort阶段,介绍如下。
(1)Copy阶段从不同MapTask处理结果的对应分区中复制数据,并将数据写入不同的内存缓冲区。
(2)当不同内存缓冲区中的数据达到指定阈值时,对不同内存缓冲区中的数据进行合并和排序,并写入磁盘形成临时文件。
(3)随着临时文件的增多,还会将这些临时文件合并排序,也生成一个新的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】计算机网络(一)

第1章 概述 文章目录 第1章 概述1.1 计算机网络在信息时代中的作用1.2 互联网概述1.2.1 网络的网络1.2.2互联网基础结构发展的三个阶段1.2.3 互联网的标准化工作 1.3 互联网的组成1.3.1 互联网的边缘部分1.3.2 互联网的核心部分 1.4 计算机网络在我国的发展1.5 计算机网络的类别…

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…

KubeSphere 开源社区 2024 年度回顾与致谢

随着 2024 年圆满落幕&#xff0c;我们回顾 KubeSphere 社区这一年走过的每一步&#xff0c;感慨万千。2024 年&#xff0c;KubeSphere 继续领跑云原生技术的创新与发展&#xff0c;推动开源文化的传播&#xff0c;致力于为全球开发者和企业用户提供更强大的平台和解决方案。感…

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

一、云电脑&#xff1a;电竞新宠崛起 在电竞游戏不断发展的今天&#xff0c;硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度&#xff0c;玩家们往往需要投入大量资金购置高性能电脑。然而&#xff0c;云电脑技术的出现&#xff0c;为玩家们提供了一种…

GitCode 助力 AutoTable:共创 MyBatis 生态的自动表格管理新篇章

项目仓库https://gitcode.com/dromara/auto-table 解放双手&#xff0c;专注业务&#xff1a;MyBatis 生态的“自动表格”创新 AutoTable 是一款致力于为 MyBatis 生态赋予“自动表格”功能的创新插件。其核心理念是通过 Java 实体类自动生成和维护数据库的表结构&#xff0c…

【useLayoutEffect Hook】在浏览器完成布局和绘制之前执行副作用

目录 前言语法useLayoutEffect 对比 useEffect&#xff1a;示例 前言 useLayoutEffect 是 React 中的一个 Hook&#xff0c; 类似于 useEffect&#xff0c;但有一个关键的区别&#xff1a;它会在所有的 DOM 变更之后同步调用 effect。这意味着它可以读取 DOM 布局并同步重新渲…

vue3-sfc-loader 加载远程.vue文件(sfc)案例

注意事项 style标签如果增加了lang比如&#xff1a;lang“scss”&#xff0c;需要提供scss-loader的处理器&#xff0c;这个暂时没研究&#xff0c;我的处理方式是将动态模版的css放在了全局打包暂时还没有测试&#xff0c;后面测试了会同步更新 安装vue3-sfc-loader npm inst…

AIGC的企业级解决方案架构及成本效益分析

AIGC的企业级解决方案架构及成本效益分析 一,企业级解决方案架构 AIGC(人工智能生成内容)的企业级解决方案架构是一个多层次、多维度的复杂系统,旨在帮助企业实现智能化转型和业务创新。以下是总结的企业级AIGC解决方案架构的主要组成部分: 1. 技术架构 企业级AIGC解决方…

NSIS系统制作Windows下的简易的安装程序

一. 前言 NSIS&#xff08;Nullsoft Scriptable Install System&#xff09;是一个专业的开源系统&#xff0c;用于创建 Windows 安装程序。拥有小巧而灵活的特点&#xff0c;受到很多用户的赞赏。 NSIS 基于脚本语言&#xff0c;允许您创建逻辑来处理比较复杂的安装任务。 官…

leetcode-不同路径问题

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 看见题目…

前端开发中的模拟后端与MVVM架构实践[特殊字符][特殊字符][特殊字符]

平时&#xff0c;后端可能不能及时给接口给前端进行数据调用和读取。这时候&#xff0c;前端想到进行模拟后端接口。本文将介绍如何通过vite-plugin-mock插件模拟后端接口&#xff0c;并探讨MVVM架构在前端开发中的应用。此外&#xff0c;我们还将讨论Vue2与Vue3的区别&#xf…

【Tool】沉浸式翻译 DeepLX

效果对比 对比一下四个常用的翻译工具的效果 不难看出只有Deepl算是在讲人话 如何配置 DeepLX 安装沉浸式翻译插件 获取APIKEY 从这获取: https://linux.do/t/topic/111737 配置 参考官方教程: https://linux.do/t/topic/111911

登录认证(3):会话跟踪技术:Session

Session概览 上文提到了&#xff0c;为了在同一个会话中共享数据&#xff08;比如用户的登录状态&#xff09;&#xff0c;我们需要使用会话跟踪技术&#xff0c;Cookie是客户端的会话跟踪技术&#xff0c;是存储在本地浏览器中的。而本文介绍另外一种会话跟踪技术Session&…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

ui文件转py程序的工具

源博客连接&#xff1a; PyCharm中利用外部工具uic转成的py文件&#xff0c;里面全是C代码&#xff0c;并非python类型的代码&#xff0c;导致大量报错。。。_pyside6-uic为什么把ui转为了c-CSDN博客 如果想把ui文件转为py文件&#xff0c;首先设置pycharm的外部工具&#xf…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…

FluentCMS:基于 ASP.NET Core 和 Blazor 技术构建的开源CMS内容管理系统

推荐一个基于 ASP.NET Core 和 Blazor 技术构建的、功能完善的开源CMS内容管理系统。 01 项目简介 FluentCMS 是一个基于强大的 ASP.NET Core 和创新的 Blazor 技术构建的现代内容管理系统&#xff08;CMS&#xff09;。 FluentCMS 设计为快速、灵活且用户友好&#xff0c;它…

Java实现简易银行账户管理系统

目录 1、项目概述 1.1 项目结构 1.2 技术栈 2、核心功能说明 2.1 账户管理 2.2 异常处理体系 3、设计理念解析 3.1 面向对象设计 3.2 关键设计点 4、使用指南 4.1 运行流程 4.2 注意事项 5、扩展建议 5.1增加功能 5.2优化方向 6、主要的功能模块代码说明 6.1exception 6.2main …

深度学习系列75:sql大模型工具vanna

1. 概述 vanna是一个可以将自然语言转为sql的工具。简单的demo如下&#xff1a; !pip install vanna import vanna from vanna.remote import VannaDefault vn VannaDefault(modelchinook, api_keyvanna.get_api_key(my-emailexample.com)) vn.connect_to_sqlite(https://va…

C# 网络协议第三方库Protobuf的使用

为什么要使用二进制数据 通常我们写一个简单的网络通讯软件可能使用的最多的是字符串类型&#xff0c;比较简单&#xff0c;例如发送格式为(head)19|Msg:Heart|100,x,y,z…&#xff0c;在接收端会解析收到的socket数据。 这样通常是完全可行的&#xff0c;但是随着数据量变大&…