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

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

时间:2025-01-19 11:33:53浏览次数:3  
标签:ReduceTask MapReduce MapTask 键值 缓冲区 原理 数据

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)随着临时文件的增多,还会将这些临时文件合并排序,也生成一个新的文件。

标签:ReduceTask,MapReduce,MapTask,键值,缓冲区,原理,数据
From: https://blog.csdn.net/2301_76901778/article/details/145130629

相关文章

  • AdaBoost算法原理与实验分析
    AdaBoost算法原理与实验分析1.引言AdaBoost(AdaptiveBoosting,自适应增强)是一种重要的集成学习算法。它的核心思想是通过迭代训练一系列弱分类器(比如简单的决策树),并将它们组合成一个强分类器。AdaBoost的特别之处在于它能够自适应地调整样本的权重,重点关注那些难以分类的......
  • XGBoost分类算法原理与实验分析
    XGBoost分类算法原理与实验分析1.引言XGBoost(eXtremeGradientBoosting,极限梯度提升)是一种高效的梯度提升树算法。它通过优化正则化目标函数,集成多个CART树(分类与回归树)来构建强大的分类器或回归模型。XGBoost在传统梯度提升树(GBDT)的基础上进行了改进,加入了正则化项以防......
  • 保姆级解析雪花算法原理,看完必懂!
    引言最近发现项目里主键id生成算法很短小精悍,遂深入看了下,还蛮有意思,在此分享一下,源码如下。privatestaticSpinLockmLock=newSpinLock();privatestaticvolatileintrotateId=0;privatestaticvolatilelongtimeId=0;privatestaticintnodeI......
  • Mysql--实战篇--连接池(连接池原理,HikariCP、C3P0、Druid和DBCP等)
    连接池(ConnectionPool)是数据库应用程序中的一种优化技术,用于管理和复用数据库连接。通过连接池,应用程序可以避免频繁创建和销毁数据库连接的开销,从而提高性能和资源利用率。在Java应用程序中,常用的MySQL连接池实现包括HikariCP、C3P0、Druid和DBCP等。1、连接池的工作原理......
  • 使用MapReduce处理爬虫数据:Python与大数据分析的完美结合
    引言随着互联网信息量的爆炸式增长,爬虫技术被广泛应用于从网页上抓取海量数据。这些数据通常需要进一步处理和分析,以提取有价值的信息。然而,随着数据量的增大,传统的单机处理方式已无法满足需求。MapReduce作为一种流行的分布式计算模型,在大规模数据集的处理上发挥了巨大的......
  • 极坐标与直角坐标之间变换的原理和应用示例
            极坐标变换的原理是将平面上的点从直角坐标系转换为极坐标系,或者从极坐标系转换为直角坐标系。以下是关于极坐标变换原理的详细解释:一、极坐标系的基本概念        在极坐标系中,一个点的位置由两个参数确定:径向距离(ρ)和极角(θ)。        (1)......
  • 代码段共享的工作原理详细说明
    1.加载程序执行请求:当用户或系统请求执行一个程序时,操作系统会接收到这个请求。加载器的作用:操作系统的加载器(loader)负责将程序的可执行文件从磁盘加载到内存中。加载器会读取可执行文件的头部信息,确定代码段、数据段、堆和栈等各个部分的大小和位置。内存分配:加载器会为......
  • Flask Web开发实战:入门、进阶与原理解析PDF免费下载
    适读人群:本书适合了解Python基本语法,想要自己动手做网站的编程人员;熟悉Python。想要从事PythonWeb开发的后端工程师、运维工程师和爬虫工程师;香葱Django等其他PythonWeb框架转向Flask的Python工程师阅读。PythonWeb框架Flask开发团队成员撰写,内容全面,从基础知识到进阶实战,再到......
  • 深入理解 DHCP:原理、中继及应用实践
    目录深入理解DHCP:原理、中继及应用实践一、DHCP原理剖析(一)诞生背景与作用(二)工作过程详解(三)其他报文介绍二、DHCP中继功能解析(一)引入中继的原因(二)工作机制(三)中继代理信息的作用(四)负载均衡配置三、总结在当今网络无处不在的时代,设备如何获取网络配置信息至关重......
  • btrfs文件系统从原理到实践 [1]
    作为Linux用户,我经常羡慕macOS系统的TimeMachine功能。TimeMachine就像是系统的最后一道防线,无论系统发生什么变化,它都能保护我们的数据安全,避免因误操作导致系统无法启动的困境。那么,Linux系统下是否也有类似的解决方案呢?基于这样的需求,我发现了Btrfs文件系统。在深入了解Btrf......