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

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

相关推荐
数字化脑洞实验室2 分钟前
如何理解不同行业AI决策系统的功能差异?
大数据·人工智能·算法
starandsea5 小时前
gitlab解决传过大文件后删除导致pack过大问题
大数据·elasticsearch·gitlab
拉姆哥的小屋6 小时前
时间序列早期分类中的置信度累积问题:从ECE-C到时序依赖建模
大数据·人工智能
蚁巡信息巡查系统6 小时前
政府网站与政务新媒体监测服务主要是做什么的?
大数据·人工智能
饼干吖6 小时前
hadoop安装
大数据·hadoop·教程
私域实战笔记9 小时前
选企业微信服务商哪家好?从工具适配与行业案例看选型逻辑
大数据·人工智能·企业微信
AI企微观察9 小时前
企业微信社群运营玩法有哪些?企业微信社群工具有哪些功能?——从拉新到留存的玩法设计与工具支撑
大数据·人工智能
金融小师妹10 小时前
OpenAI拟借AI估值重构浪潮冲击1.1万亿美元IPO——基于市场情绪因子与估值量化模型的深度分析
大数据·人工智能·深度学习·1024程序员节
wudl556611 小时前
Flink Keyed State 详解之二
大数据·flink
IT学长编程12 小时前
计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·django·毕业设计·课程设计·毕业论文