📖 前言:MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算问题,是目前分布式计算模型中应用较为广泛的一种。
目录
- 🕒 1. MapReduce概述
- 🕘 1.1 核心思想:分而治之
- 🕘 1.2 编程模型
- 🕘 1.3 经典实例——词频统计
- 🕒 2. MapReduce工作原理
- 🕘 2.1 工作过程
- 🕘 2.2 MapTask
- 🕘 2.3 ReduceTask
- 🕘 2.4 Shuffle
- 🕤 2.4.1 MapTask中的Shuffle
- 🕤 2.4.2 ReduceTask中的Shuffle
- 🕒 3. MapReduce编程组件
- 🕘 3.1 InputFormat组件
- 🕘 3.2 OutputFormat组件
- 🕘 3.3 Combiner组件
- 🕘 3.4 Mapper组件
- 🕘 3.5 Reducer组件
- 🕘 3.6 Partitioner组件
- 🕒 4. MapReduce运行模式
- 🕒 5. MapReduce经典案例
- 🕒 6. 课后习题
🕒 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>
的形式输出。
- 输入ReduceTask的数据流是
- 写入文件
- MapReduce 会自动把 ReduceTask 生成的
<key,value>
传入 OutputFormat 的 write 方法,即以键值对的形式写入指定目录的文件,如 part-0、part-1和 part-2。实现文件的写入操作。
- MapReduce 会自动把 ReduceTask 生成的
Q:HDFS Block与MapReduce split之间的联系?
A:Block:HDFS中最小的数据存储单位,默认是128M;Split:MapReduce中最小的计算单元,默认与Block一一对应。
🕘 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阶段。
- MapTask 处理的结果会暂且放入一个内存缓冲区中(该缓冲区默认大小是100MB),当缓冲区快要溢出时(默认达到缓冲区大小的 80%),会在本地文件系统创建一个溢出文件,将该缓冲区的数据写入这个文件。
- 写入磁盘之前,线程会根据 ReduceTask 的数量将数据分区,一个 ReduceTask 对应一个分区的数据。这样做的目的是为了避免有些 ReduceTask 分配到大量数据,而有些 ReduceTask 分到很少的数据,甚至没有分到数据的尴尬局面。
- 分完数据后,会对每个分区的数据进行排序,如果此时设置了Combiner,将排序后的结果进行 Combine 操作,这样做的目的是尽可能减少执行数据写入磁盘的操作。
- 当 MapTask 输出最后一个记录时,可能有很多溢出文件,这时需要将这些文件合并,合并的过程中会不断地进行排序和Combine操作,其目的有两个:一是尽量减少每次写入磁盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。
- 将分区中的数据复制给对应的 ReduceTask 。
🕤 2.4.2 ReduceTask中的Shuffle
ReduceTask中的Shuffle是从Copy阶段到Sort阶段。
- Reduce会接收到不同map任务传来的数据,并且每个 map传来的数据都是有序的。如果 Reduce阶段接收的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。
- 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。
- 合并的过程中会产生许多的中间文件(写入磁盘了),但 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分布式计算框架”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页