MapReduce(林子雨慕课课程)
文章目录
- 7. MapReduce
- 7.1 MapReduce简介
- 7.1.1 分布式并行编程
- 7.1.2 MapReduce模型简介
- 7.2 MapReduce体系结构
- 7.3 MapReduce工作流程概述
- 7.4 Shuffle过程原理
- 7.5 MapReduce应用程序的执行过程
- 7.6 WordCount实例分析
- 7.7 MapReduce的具体应用
- 7.8 MaReduce编程实践
7. MapReduce
7.1 MapReduce简介
MapReduce是一种分布式并行编程框架
- 数据处理能力提升的两条路线:
- 单核CPU到双核到四核到八核
- 分布式并行编程
7.1.1 分布式并行编程
-
借助一个集群通过堕胎机器同时并行处理大规模数据集
-
相关的并行编程框架

-
并行编程模型和传统的并行编程框架的区别

7.1.2 MapReduce模型简介
-
MapReduce包含两大函数:Map和Reduce
-
MapReduce策略:
-
采用分而治之的做法

-
-
MapReduce理念
-
计算向数据靠拢,而不是数据向计算靠拢
-
什么事数据向计算靠拢?
-
即完成一次数据分析时,选择一个计算节点,把运行数据分析的程序放在计算节点上运行
-
然后把它所涉及的数据,全部从各个不同的节点上面拉过来,传输到计算发生的地方

-
MapReduce采用计算向数据靠拢的方式
- 即会寻找离这个数据节点最近的Map机器做这个机器上的数据分析
- 通常Map机器和数据在同一个台机器上,从而大大减少网络中的数据传输靠开销

-
MapReduce架构:Master/Slave的架构

-
-
-
-
Map函数和Reduce函数
-
Map函数

-
Reduce函数

-
7.2 MapReduce体系结构
-
MapReduce体系结构

-
Client(客户端)
- 通过client可以提交用户编写的应用程序,用户通过它将应用程序交给JobTracker端
- 通过这些Client用户也可以通过它提供一些接口去查看当前提交作业的运行状态
-
JobTracker(作业跟踪器)
- 负责资源的监控和作业的调度
- 监控底层的其他的TaskTracker以及当前运行的Job的健康状况
- 一旦探测到失败的情况就把这个任务转移到其他节点继续执行跟踪任务执行进度和资源使用量
-
TaskTracker(任务调度器)
-
执行具体的相关任务一般接受JobTracker发送过来的命令
-
把一些自己的资源使用情况,以及任务的运行进度通过心跳的方式,也就是heartbeat发送给JobTracker
-
使用slot概念,将自己机器的cpu、内存资源等分为slot
- 两种类型的slot不互相通用,map类型的slot不能用了reduce任务,这是1.0的缺陷

-
Task任务也有两种:map任务和reduce任务

-
-
7.3 MapReduce工作流程概述
-
MapReduce工作流程
- 将数据分片处理,利用map进行输入(key,value)类型,然后通过Reduce任务输出(key,value)类型到HDFS
- 将map的结果进行排序、归并、合并(shuffle),结束后将结果分发给相应的Reduce处理
- 注意不同map任务之间不进行通信,不同Reduce任务之间也不会进行信息交换

-
MapReduce执行的各个阶段
- 数据通过InputFormat从HDFS读取文件,并对输入进行格式验证
- 将大数据集切分成多个split分片,不是物理上的切分,只是逻辑上的切分
- Record Reader(RR):记录阅读器,根据分片的距离位置信息,从HDFS的各块将数据分片的信息读出,输出为(key,value)形式,作为map的输入
- Map:用户撰写的处理逻辑,生成一系列的(key,value)的中间结果
- 通过shuffle(分区,排序,合并)过程,将相关的键值对分发给相应的Reduce任务处理
- 编写Reduce处理逻辑,任务结束后,分析结果以(key,value)形式显示
- outoutformat检查输出格式,写入HDFS系统

-
分片的具体过程
-
一个大文件在HDFS中可能由多个块组成,如下图例子在物理上被分为6块,但在逻辑上通过split分块四块内容
-
每个分片都是一个map任务,如果分片过少,影响并行效率;若分片过多,map切换耗费相关管理资源,影响执行效率
-
一般来说会将一个块的大小作为HDFS的分片大小,因为假如block1和block2不在一个机器上面,block1运行split1的map任务,此时
需要将数据从block2机器存到block1所在的机器,会出现额外的数据开销

-
-
Reduce任务的数量
- 最优的Reduce任务个数取决于集群中可用的Reduce任务槽(slot)的数目
- 通常设置比reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)
7.4 Shuffle过程原理
-
Shuffle过程简介
- HDFS输入数据,分片操作,每个分片都启动一个Map任务,Map任务中包含对用户的处理逻辑
- Map输出结果(键值对),输出到缓冲区,若缓冲区满了,则发生溢写
- 溢写过程:将缓存区的数据(经过分区排序合并处理之后)写到磁盘,同时清空缓冲区
- 溢写发生多次,生成多个磁盘文件,要对这些磁盘文件做统一归并
- 归并完成后,通知Reduce任务来取走磁盘分区内的数据
- 取走后,Reduce任务要执行归并、合并操作,将合并后的数据传递给Reduce函数
- 最后输出到相应的HDFS文件系统

-
Shuffle过程分类

-
Map端的Shuffle过程
-
每个Map任务都会给其分配相应的缓存,一般来说是100M
-
如果缓存满了再启动溢写,可能会导致后来Map生成的值无法写入缓冲区,丢失值。
因此,在溢写的时候会设置一个溢写比例,例如80%,即如果写出内容占缓存比例的80%的时候启动溢写,剩余20M空间可以供给给后来生成的map
-
溢写的分区操作,主要是利用分区分给不同的Reduce任务,排序操作内部会自动完成,合并操作不是必须的,若用户定义合并操作,则会启动合并操作,如(a,1)(a,1)会被合并为(a,2)

-
-
Reduce端的Shuffle过程
- 向JobTracker询问自己所需要的数据是否能够可以取出,JobTracker监测Map任务,若是任务完成了,就通知Reduce任务将任务取走
- Reduce从Map机器上将任务拉去到本地,Map任务生成的键值对是从不同的Map机器上拉去的,可以继续做归并操作
- 注意这个归并操作不同于合并,合并是将(a,1)(a,1)合并为(a,2)这种形式,归并是将多个Map中的(a,1)合并为<a,<1,1,1>>
- 所以若Map过程没有合并操作,得到的就是<a,<1,1,1>>形式数据,归并之后若是用户定义了合并操作,会将其合并为<a,3>形式数据

-
7.5 MapReduce应用程序的执行过程
-
整个执行过程

-
-
程序部署:将程序分发到不同机器上

-
-
-
分配Worker执行Map任务和Reduce任务

-
-
-
选择空闲Worker机器进行分片,然后读取数据,分给不同的Worker执行Map任务,生成(key,value)键值对,输出结果先写到缓存

-
-
-
缓存满了会将数据写到本地

-
-
-
Reduce机器将数据拉回到本地处理

-
-
-
将相关的结果写到输出文件中去

-
-
7.6 WordCount实例分析
-
WordCount程序任务:满足MapReduce分而治之的要求

-
一个WordCount执行过程的实例

-
假设用户没有定义合并(combine)操作,shuffle操作之后生成的是(key,value-list)形式

-
假如用户定义了Combine操作:

-
7.7 MapReduce的具体应用
-
相关应用

-
举例:MapReduce实现关系的自然连接

-
用Map实现自然连接的过程:原理

-
具体过程

-
7.8 MaReduce编程实践
见:[MapReduce编程实践(Hadoop3.3.5)_厦大数据库实验室博客 (xmu.edu.cn)](
相关文章:
MapReduce(林子雨慕课课程)
文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …...
PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端
程序前台与后台自适应PC与移动端,支持一对多交流,可以自由创建新的房间与解散创建的房间,集成签到功能,等级功能,房间创建者可以对用户进行禁言、拉黑处理,房间可以由房间创建者自由设置进入密码࿰…...
算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)
这道题是贪心算法的中级难度练习题,由于题目设定,整个价格都是透明的,这里并不涉及需要预测股票涨势的问题。解决思路不难,就是一旦股票价格开始下降了就买入,一旦上升了,就赶紧卖出。(完整题目…...
Redis-持久化机制
持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术,他是看时间间隔内key值的变化量,就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程(bgsave),通过这个子进程,将数据快照进…...
【LeetCode热题100】--155.最小栈
155.最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…...
Allegro 17.2如何直接更新元件封装?
想必很多从事电子设计的小伙伴,都有这样的经历:有些时候原理图和PCB设计是由不同的工程师负责,然后偶尔需要在没有原理图的情况下直接对PCB作品进行操作,如更新元件封装等操作,这种环节不仅费时费力,效率贼…...
高效数据管理:Java助力实现Excel数据验证
摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在Java中,开发者可以使用一些开源的库(如Apache POI)…...
Easysearch Chart 0.2.0都有哪些变化
Easysearch Chart 包更新了,让我们来看看都有哪些变化: Docker 镜像升级 Service 名称调整,支持 NodePort 模式部署 现在让我们用 NodePort 模式部署一下: # helm search repo infinilabs NAME CHART VERSION …...
RV1126-RV1109-进入uboot的按键和名字显示-HOSTNAME
今天添加一个小功能,就是uboot是按CTRLC进入的 今日我做了一个定制,让按L或者l让也进入uboot指令模式,并且修改主板名字显示 默认是CTRLC:键码值是0x03(ASCII对照表) 于是代码中跟踪: //rv1126_rv1109/u-boot/common/console.c int ctrlc(void) { #ifndef CONFIG_SANDBOXif (…...
学习vue-router
可参见: vue-router 详解_vue router_七月J的博客-CSDN博客 https://www.cnblogs.com/chen-ao666/p/17144552.html vue-router的使用 使用vue-router的步骤: 创建路由组件 配置路由映射: 组件和路径映射关系 使用路由: 通过和 <router-link>: 该标签是一个vue-router中…...
Python爬虫提高排名
在如今竞争激烈的互联网时代,网站的SEO优化变得尤为重要。而Python爬虫作为一种强大的工具,可以帮助网站主们提升搜索排名,吸引更多的流量和用户。本文将为您揭秘如何利用Python爬虫来改善您的SEO优化,并帮助您提升搜索排名。无论…...
SQL获取正数第N个或倒数第N个数据
这里我们使用Order By与Limit的组合: Order By:可以将某个序列值按照从大到小或从小到大排序Limit:如果类似Limit 5表示前5个,Limit 3,5表示从第4个位置(以0为开始)开始往后取5个 通过这样的组合就可以实…...
链表(2)——带头双向循环链表
🍁一、链表的分类 🌕1.单向或者双向 🌕2.带头或者不带头(有无哨兵) 🌕3.循环或者不循环 🌕4.无头单向非循环链表(常用) 🌕5.带头双向循环链表(常用…...
C语言 函数指针
函数指针是C语言中的一种特殊类型,它允许你像操作变量一样操作函数。函数指针的主要用途是存储并后续调用一组函数。 在C语言中,函数指针的定义通常如下所示: 返回类型 (*指针变量名)(参数类型) 例如,如果你有一个返回整数并接受…...
F. Vasilije Loves Number Theory
Problem - F - Codeforces 思路:分析一下题意,对于第一种操作来说,每次乘以x,那么nn*x,然后问是否存在一个a使得gcd(n,a)1并且n*a的约数个数等于n,有最大公约数等于1我们能够知道其实这两个数是互质的&…...
electron打包后主进程下载文件崩溃
electronvue3写了一个小项目,实现了一个文件下载功能 存在的问题 打包后,应用下载文件崩溃代码 // 渲染进程window.electron.ipcRenderer.invoke(save-file, {path: r.filePath,fileurl: previewUrl,}).then(response > {console.log(response ----…...
Spring实例化源码解析之Custom Events下集(九)
上集从官网的角度讲解了基本的使用和源码的内容,没有深入的进行分析,本章将从源码的角度分析ApplicationEvent、ApplicationListener、ApplicationEventMulticaster这三者之间的关系。 initApplicationEventMulticaster 上一章后续部分给出了源码的含义…...
python numpy库关键函数说明
python numpy库函数说明 np.argwhere()np.dtype()np.shape()np.zeros() np.argwhere() 输入参数是一个基本的逻辑表达式,输出检索结果的索引值。 >>> x np.arange(6).reshape(2,3) >>> x array([[0, 1, 2],[3, 4, 5]]) >>> np.argwhe…...
【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)
文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间,即程序如何分…...
IP协议总结
一、定义。 IP全称为Internet Protocol,是TCP/IP协议族中的一员,负责实现数据在网络上的传输。它是一种无连接、不可靠的数据报协议。 IP协议常用于Internet网络和局域网中,它通过将数据包进行分组并进行逐跳转发来实现数据在网络中的传输。…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
