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

本文主要是介绍【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📖 前言: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>的形式输出。
  • 写入文件
    • MapReduce 会自动把 ReduceTask 生成的<key,value>传入 OutputFormat 的 write 方法,即以键值对的形式写入指定目录的文件,如 part-0、part-1和 part-2。实现文件的写入操作。

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阶段。

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

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

这篇关于【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816435

相关文章

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram