【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
博客链接:🔎 作者博客主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 虚拟机安装

最小化安装后常用工具 sudo apt-get install vim# ifconfig apt install net-tools # nload apt install nload # 很多都要用到 apt install build-essential # 开发相关 apt install gcc gapt install iproute2 ntpdate tcpdump telnet traceroute \ nfs-kernel-server nfs…

Ubuntu 14.04:安装 PaddleOCR 2.3

目录 一、说明 1.1 如何选择版本 1.2 查看 github 中的 PaddleOCR 版本 二、安装 2.1 安装前环境准备 2.2 下载包 2.3 解压 2.4 安装依赖库 异常处理&#xff1a;Read timed out. 2.5 下载推理模型&#xff1a;inference 2.5.1 模型存放位置 2.5.2 模型下载链接 2.5.…

JVM学习-底层字节码的执行过程

目录 1.一个简单的程序分析 2. a&#xff0c;a&#xff0c;a--在JVM中的执行过程 3. 一个好玩的xx 4.方法调用的字节码分析、多态的实现、对象头 5. try-catch-finally的字节码分析 5.1 try-catch 5.2 try-catch-finally 5.3特殊情况 5.3.1 try和finally块中都出现了re…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

SQL的执行与优化

文章目录 MySQL查询原理与优化一、select语句的执行顺序二、join 的执行与优化1、驱动表 & 被驱动表2、Simple Nested Loop Join3、Index Nested Loop Join4、Block Nested Loop Join5、Hash Join6、join 优化小结 三、on 与 where 对比四、group by 的执行与优化1、group …

刚刚离乳的幼猫该如何选择猫粮品牌?

亲爱的猫友们&#xff0c;当你家的幼猫刚刚离乳&#xff0c;准备踏入猫粮的世界时&#xff0c;如何选择一款合适的猫粮品牌确实是个让人头疼的问题。&#x1f43e; 别担心&#xff0c;今天我就来为大家推荐一款值得信赖的幼猫粮——福派斯幼猫粮。 1️⃣ 考虑幼猫的营养需求 幼…

macOS系统中通过brew安装MongoDB

Macos 修改目录权限&#xff1a; sudo chmod -R 777 你的文件夹 本文使用homebrew进行安装简单&#xff0c;因为从官网下载安装包并手动安装需要移动安装包到合适的目录下并配置环境变量等一大堆操作后才能使用数据库&#xff08;若没有安装过brew请自行百度进行安装brew&am…

ArkTs的资源Resource类型怎么转为string

使用ResourceManager同步转换 请参看&#xff1a;ResourceManager.getStringSync9 例子&#xff1a; try { let testStr: string this.context.resourceManager.getStringSync($r(app.string.test).id); } catch (error) { console.error(getStringSync failed, error code…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

MySQL语法分类 DQL(1)基础查询

//语法 select 字段列表 from 表名列表 where条件列表 group by分组字段 having 分组后的条件 order by排序 limit 分页限定为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),ma…

将 OpenCV 与 Eclipse 结合使用(插件 CDT)

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;将OpenCV与gcc和CMake结合使用 下一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 警告&#xff1a; 本教程可以包含过时的信息。 先决条件 两种方式&#xff0c;一种…

CODESYS开发教程13-长字符串处理

摘要&#xff1a;这是一篇写给新手的关于CODESYS开发环境的小白教程&#xff0c;一看就懂...... 在以前的《CODESYS开发教程7-字符串及其基本操作》教程中&#xff0c;介绍了字符串及其基本操作&#xff0c;有朋友看了以后觉得不过瘾&#xff0c;希望有一些关于字符串的更加深入…

javaweb员工健康管理监护系统

项目演示视频 &#xff08;链接&#xff1a;https://pan.baidu.com/s/1WliYEUH4c0HVB7s0-1WDUA 提取码&#xff1a;1234 --来自百度网盘超级会员V5的分享&#xff09; 该项目所用到技术 java ssh框架 3&#xff1a;该项目的用到的开发工具&#xff1f; eclipse和idea都可以、m…

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

JVM学习-垃圾回收专题

目录 1.如何判断对象可以回收 1.1引用计数法 1.2可达性分析算法 1.3五种引用 1.4拓展&#xff1a;直接内存 2.垃圾回收算法 2.1标记清除算法 2.2标记整理算法 2.3复制 3.分代垃圾回收 3.垃圾回收器 3.1串行垃圾回收器 3.2吞吐量优先垃圾回收器 3.3响应时间优先垃圾回收器…

Qt 实现 Asterix 报文解析库

【写在前面】 最近工作中需要解析 Cat 21 和 Cat 62 的 ADS-B 数据 ( 自己的工作包含航空领域 )。 然后&#xff0c;因为整个 Asterix 协议类别非常之多&#xff0c;每个类别的版本也多&#xff0c;纯手工实现每个版本解析根本不现实 ( 然鹅公司之前的解析库就是这么做的且做的…

win10 + cpu + pycharm + mindspore

MindSpore是华为公司自研的最佳匹配昇腾AI处理器算力的全场景深度学习框架。 1、打开官网&#xff1a; MindSpore官网 2、选择以下选项&#xff1a; 3、创建conda 环境&#xff0c;这里python 选择3.9.0&#xff0c;也可以选择其他版本&#xff1a; conda create -c conda-…

智慧交通:构建智慧城市的重要一环

随着信息技术的飞速发展&#xff0c;智慧城市已成为现代城市发展的重要方向。作为智慧城市的重要组成部分&#xff0c;智慧交通以其高效、便捷、环保的特性&#xff0c;成为推动城市现代化进程的关键力量。本文将从智慧交通的概念、发展现状、面临挑战以及未来趋势等方面&#…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…