0
点赞
收藏
分享

微信扫一扫

【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)

📖 前言:MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算问题,是目前分布式计算模型中应用较为广泛的一种。

在这里插入图片描述


目录

🕒 1. MapReduce概述

🕘 1.1 核心思想:分而治之

使用MapReduce操作海量数据时,每个MapReduce程序被初始化为一个工作任务,每个工作任务可以分为Map和Reduce两个阶段。

  • Map阶段:负责将工作任务分解为若干个子任务来并行处理,这些子任务相互独立,可以单独被执行。
  • Reduce阶段:负责将Map过程处理完的子任务结果合并,从而得到工作任务的最终结果。

在这里插入图片描述

MapReduce就是“任务的分解与结果的汇总”。即使用户不懂分布式计算框架的内部运行机制,但是只要能用Map和Reduce思想描述清楚要处理的问题,就能轻松地在Hadoop集群上实现分布式计算功能。

🕘 1.2 编程模型

MapReduce是一种编程模型,用于处理大规模数据集的并行运算。使用MapReduce执行计算任务的时候,每个任务的执行过程都会被分为两个阶段,分别是Map和Reduce,其中Map阶段用于对原始数据进行处理,Reduce阶段用于对Map阶段的结果进行汇总,得到最终结果。

在这里插入图片描述

🕘 1.3 经典实例——词频统计

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

文件test1.txt的内容

Hello World
Hello Hadoop
Hello itcast

文件test2.txt的内容

Hadoop MapReduce
MapReduce Spark

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

  • 首先,MapReduce通过默认组件TextInputFormat将待处理的数据文件(如text1.txt和text2.txt),把每一行的数据都转变为<key,value>键值对。其中键(Key)是指每行数据的起始偏移量,也就是每行数据开头的字符所在的位置,值(Value)是指文本文件中的每行数据。
  • 其次,调用Map()方法,将单词进行切割并进行计数,输出键值对作为Reduce阶段的输入键值对。
  • 最后,调用Reduce()方法将单词汇总、排序后,通过TextOutputFormat组件输出到结果文件中。

在这里插入图片描述

🕒 2. MapReduce工作原理

🕘 2.1 工作过程

流程:分片、格式化数据源 → 执行MapTask → 执行Shuffle过程 → 执行ReduceTask → 写入文件

在这里插入图片描述

  • 分片(Split)和格式化数据源
    • 分片操作:指将原始数据文件file划分为多个数据块,每个数据块默认是128MB,即block1、block2 和 block3,MapReduce 会为每个数据块创建一个 MapTask,并由该MapTask 运行 map()方法,处理数据块内的每行数据。
    • 格式化操作:将划分好的分片格式化为键值对<key,value>形式的数据,其中,key 代表偏移量,value代表每一行内容。
  • 执行MapTask
    • 每个MapTask都有一个内存缓冲区(大小默认为100MB),键值对经过处理后,会将中间结果暂时写入内存缓冲区。
  • 执行 Shuffle 过程
    • MapReduce 工作过程中,Map 阶段处理的数据传递给 Reduce 阶段的过程叫作 Shuffle。Shuffle会将 MapTask 输出的处理结果数据分发给 ReduceTask,并在分发的过程中,对数据按 key 进行分区和排序。
  • 执行ReduceTask
    • 输入ReduceTask的数据流是<key,{value list}>形式,用户可以自定义reduce()方法进行逻辑处理,最终以<key,value>的形式输出。
  • 写入文件
    • MapReduce 会自动把 ReduceTask 生成的<key,value>传入 OutputFormat 的 write 方法,即以键值对的形式写入指定目录的文件,如 part-0、part-1和 part-2。实现文件的写入操作。

🕘 2.2 MapTask

MapTask作为MapReduce工作流程前半部分,它主要经历5个阶段,分别是Read阶段、Map阶段、Collect阶段、Spill阶段和Combiner阶段

在这里插入图片描述

  • Read阶段:通过MapReduce内置的InputSplit组件将读取的文件进行分片处理,将数据块中的数据映射为键值对形式。
  • Map阶段:将Read阶段映射的键值对进行转换,并生成新的键值对。
  • Collect阶段:将Map阶段输出的键值对写入内存缓冲区。
  • Spill阶段:判断内存缓冲区中的数据是否达到指定阈值。
  • Combine阶段:将写入本地磁盘的所有临时文件合并成一个新的文件,对新文件进行归并排序。

🕘 2.3 ReduceTask

ReduceTask的工作过程主要经历了5个阶段,分别是Copy阶段、Merge阶段、Sort阶段、Reduce阶段和Write阶段
在这里插入图片描述

  • Copy阶段:从不同的MapTask复制需要处理的数据,将数据写入内存缓冲区。
  • Merge阶段:对内存和磁盘上的文件进行合并,防止内存使用过多或者磁盘文件过多。
  • Sort阶段:由于各个 MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
  • Reduce阶段:根据实际应用场景自定义reduce()方法,对Sort阶段输出的键值对进行处理。
  • Write阶段:将Reduce阶段生成的新键值对写入HDFS中。

🕘 2.4 Shuffle

Shuffle是MapReduce的核心,它用来确保每个ReduceTask的输入数据都是按键排序的。它的性能高低直接决定了整个MapReduce程序的性能高低,map和reduce阶段都涉及到了shuffle机制。
在这里插入图片描述

🕤 2.4.1 MapTask中的Shuffle

MapTask中的Shuffle是从Collect阶段到Combine阶段。

  1. MapTask 处理的结果会暂且放入一个内存缓冲区中(该缓冲区默认大小是100MB),当缓冲区快要溢出时(默认达到缓冲区大小的 80%),会在本地文件系统创建一个溢出文件,将该缓冲区的数据写入这个文件。
  2. 写入磁盘之前,线程会根据 ReduceTask 的数量将数据分区,一个 ReduceTask 对应一个分区的数据。这样做的目的是为了避免有些 ReduceTask 分配到大量数据,而有些 ReduceTask 分到很少的数据,甚至没有分到数据的尴尬局面。
  3. 分完数据后,会对每个分区的数据进行排序,如果此时设置了Combiner,将排序后的结果进行 Combine 操作,这样做的目的是尽可能减少执行数据写入磁盘的操作。
  4. 当 MapTask 输出最后一个记录时,可能有很多溢出文件,这时需要将这些文件合并,合并的过程中会不断地进行排序和Combine操作,其目的有两个:一是尽量减少每次写入磁盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。
  5. 将分区中的数据复制给对应的 ReduceTask 。

🕤 2.4.2 ReduceTask中的Shuffle

ReduceTask中的Shuffle是从Copy阶段到Sort阶段。

  1. Reduce会接收到不同map任务传来的数据,并且每个 map传来的数据都是有序的。如果 Reduce阶段接收的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。
  2. 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。
  3. 合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到 reduce 函数,

🕒 3. MapReduce编程组件

🕘 3.1 InputFormat组件

主要用于描述输入数据的格式,它提供两个功能,分别是数据切分和为Mapper提供输入数据。

🕘 3.2 OutputFormat组件

OutputFormat是一个用于描述MapReduce程序输出格式和规范的抽象类。

🕘 3.3 Combiner组件

Combiner组件的作用就是对Map阶段的输出的重复数据先做一次合并计算,然后把新的(key,value)作为Reduce阶段的输入。

🕘 3.4 Mapper组件

Hadoop提供的Mapper类是实现Map任务的一个抽象基类,该基类提供了一个map()方法。

🕘 3.5 Reducer组件

Map过程输出的键值对,将由Reducer组件进行合并处理,最终的某种形式的结果输出。

🕘 3.6 Partitioner组件

Partitioner组件可以让Map对Key进行分区,从而可以根据不同的key分发到不同的Reduce中去处理,其目的就是将 key 均匀分布在 ReduceTask 上

🕒 4. MapReduce运行模式

本地运行模式:在当前的开发环境模拟MapReduce执行环境,处理的数据及输出结果在本地操作系统。

集群运行模式:把MapReduce程序打成一个Jar包,提交至Yarn集群上去运行任务。由于Yarn集群负责资源管理和任务调度,程序会被框架分发到集群中的节点上并发的执行,因此处理的数据和输出结果都在HDFS文件系统中。

🕒 5. MapReduce经典案例

详见下文:

🔎 MapReduce经典案例实战(倒排索引、数据去重、TopN)

🕒 6. 课后习题

判断题:
1、Map阶段处理数据时,是按照key的哈希值与 ReduceTask 数量取模进行分区的规则。 ()
2、分区数量是 ReduceTask 的数量。 ()
3、在 MapReduce程序中,必须开发 Map和Reduce相应的业务代码才能执行程序。()

答案:1.√ 、2.√ 、3.×


OK,以上就是本期知识点“MapReduce分布式计算框架”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~

举报

相关推荐

0 条评论