Hadoop3教程(十一):MapReduce的详细工作流程

文章目录

  • (94)MR工作流程
    • Map阶段
    • Reduce阶段
  • 参考文献

(94)MR工作流程

本小节将展示一下整个MapReduce的全工作流程。

Map阶段

首先是Map阶段:

在这里插入图片描述

  1. 首先,我们有一个待处理文本文件的集合;

  2. 客户端开始切片规划;

  3. 客户端提交各种信息(如切片规划文件、代码文件及其他配置数据)到yarn;

  4. yarn接收信息,计算所需的MapTask数量(按照切片数);

  5. MapTask启动,读取输入文件,默认使用的是TextInputFormat。输出KV对,以TextInputFormat为例,K是偏移量(行在整个文件的字节数),V是这一行的内容;

  6. TextInputFormat读取完毕后,将得到的KV对都输入Mapper(),做自定义业务逻辑处理(核心处理部分);

  7. Mapper()处理完的数据,放入outputCollector,也被叫做环形缓冲区;环形缓冲区是位于内存中的,其实就是个缓冲数组,里面每行数据是分左右两部分,右边一部分是KV数据位,存放的是输入进来的K值和V值,左边一部分是对应的索引数据,存放的信息有:本行KV对的索引、本行KV对的分区、keystart以及valuestart;这里的keystart和valuestart都是指数据在内存中的存储位置,(keystart~valuestart)表示本行key值的存储起止位置,而(valuestart~下一行数据的keystart)表示本行value值的存储起止位置,其他行以此类推。

    环形缓冲区默认大小是100M,它有个有趣的机制用来协调写 + 磁盘持久化。当写满到80%的时候,环形缓冲区会开始进行反向逆写操作

    什么是反向逆写呢?

    可以结合数组做简单理解,就是假设数组有100个位置,即索引位0~99,当写到80%位置,即从索引0开始,到索引79写完了之后,就开始反向逆写,从索引99开始往前写,依次是98/97这样子。

    为什么要这么设置?

    很简单,当写满到80%的时候,系统会开启一个线程,将这80%的数据持久化到磁盘,但持久化的同时,一般希望不会影响正常的写,于是留了20%的空位置,供正常的写操作。因此是持久化 + 写,并行运行。

    想象一下,如果规定只有写满到100%之后才能持久化到磁盘,或者说溢出到磁盘,那么在它持久化的过程中,整个写流程就必须暂停,直到持久化完成后,环形缓冲区清空后才能继续写,这个时间消耗未免太长,效率太低。这么看的话,它这个80%后开始逆写的设置,还挺棒的。

    这里有个潜在的问题,就是如果系统写的很快,在没有持久化完那80%之前,那20%的空位置就写满了,这时候会发生什么情况?

    这时候,写流程就不得不暂停,直到持久化完成之后再恢复写。

  8. 注意,上一步中持久化,或者说溢写数据之前,会先将数据分区(不同分区的数据在Reduce阶段将会被送进不同的ReduceTask)。然后分区内做排序,一般使用快排。

    那排序是针对什么来排呢?

    不是数据的KV,而是数据的那几个索引。

  9. 将数据溢出至文件。注意,单次溢写的数据虽然是写在一个文件里,但是是分区且分区内有序的。

  10. 在数据溢出数次后,我们就有了好几个文件,接下来我们将这些文件merge,做归并排序,相当于是合并成一个文件,然后将结果存储在磁盘。

  11. 做预聚合。比如说如果有两个<a, 1>,那可以直接合并成<a, 2>。当然,这一步并不是必要的,可以结合实际场景具体看是否需要。

到这里,一个MapTask的工作就正式结束了,其他的MapTask就是重复以上过程。

Reduce阶段

Reduce阶段:

在这里插入图片描述

  1. 一般情况下,等所有MapTask任务都完成后,就会启动响应数据的ReduceTask,并告知每个ReduceTask它需要处理的数据范围。

    这里说的是一般情况下,实际上我们也可以设置,等到一部分MapTask完成之后就先启动几个ReduceTask做处理,相当于Map阶段和Reduce阶段同时进行。这个比较适合MapTask很多的情况,比如说有100个MapTask,等到100个都执行完,才进入Reduce阶段,未免太慢了,所以可以这样并行走。

  2. ReduceTask 主动 从MapTask的结果数据中去拉取需要的数据,然后做合并文件 + 归并排序

    举个例子,ReduceTask_1可能会从MapTask_1拉取指定分区数据,也会从MapTask_2中拉取该分区的数据,这样的话就会有多个文件,而且虽然每个文件内部是有序的(MapTask处理过),但是不同文件之间可能是无序的,因此合并文件 + 归并排序,是很有必要的。

  3. 对上一步产生的结果,一次读取一组,送进Reducer()去做业务逻辑处理。这里的一组是KEY值相同作为一组,因为上一步中已经排序过了,所以KEY值相同的会被放在一起,直接取这一组就可以了。

  4. 分组,暂且不表;

  5. Reducer()处理完了之后,由OutputFormat往外输出,默认是TextOutputFormat,即输出成文本文件。

这就是整个MR处理的流程。

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】

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

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

相关文章

微信聊天记录真的可以被监听吗?

你们好&#xff0c;我的网工朋友 不少朋友都和身边的人交流过同一个话题&#xff1a; “自己的微信聊天记录到底能不能被公司窃取查看&#xff1f;” “可以的&#xff0c;在哪个群&#xff0c;和谁聊了什么&#xff0c;看的一清二楚&#xff0c;还可以搜索……” 这类型的…

Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 讨论在Android应用程序中使用Kotlin Flow高效加载…

springBoot复杂对象表示和lombok的使用

springBoot复杂对象表示 前言简单案例lombok的使用通过properties文件进行绑定在yaml文件中使用 前言 对象&#xff1a;键值对的集合&#xff0c;如&#xff1a;映射&#xff08;map)/哈希&#xff08;hash)/字典&#xff08;dictionary&#xff09; 数组&#xff1a;一组按次…

leetcode做题笔记174. 地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

Java应用性能问题诊断技巧

作者&#xff1a;张彦东 参考&#xff1a;https://developer.aliyun.com/ebook/450?spma2c6h.20345107.ebook-index.28.6eb21f54J7SUYc 文章目录 &#xff08;一&#xff09;内存1.内存2.内存-JMX3.内存-Jmap4.内存-结合代码确认问题 &#xff08;二&#xff09;CPU1.CPU-JMX或…

史上最短的“牛熊转换”:BTC价格昨夜起飞,但却来自一条假新闻!

昨夜&#xff0c;加密市场经历了史上最短的一次“牛熊转换”。 在短短10分钟内&#xff0c;BTC快速走出多根阳线&#xff0c;价格直接起飞&#xff0c;连续突破28000美元、29000美元、30000美元的整数关口&#xff0c;最高触及30535.8美元&#xff0c;涨幅近10%&#xff08;数据…

Compose Canvas基础(2) 图形转换

Compose Canvas基础&#xff08;2&#xff09;图形转换 前言平移 translate缩放 scale旋转 rotate自定义绘图区域及绘制内边距inset组合转换 withTransform完整代码总结 上一篇文章 Compose Canvas基础&#xff08;1&#xff09; drawxxx方法 前言 阅读本文需要一定compose基…

mysql——面试题初体验

查询环境 1、student&#xff08;学生表&#xff09; 2、课程表(course) 3、教师表(teacher) 4、成绩表(score) 问题 (1) 查询所有学生的学号、姓名、选课数、总成绩 mysql> select s.s_id as 学号,s.s_name as 姓名 from student as s; ---------------- | 学号 | 姓名…

E138: Can‘t write viminfo file

E138: Can’t write viminfo file /home/xxx/.viminfo! 原因 进入/home/xxx/目录下&#xff0c;用ls -a你会发现有很多.viminfa.tmp - .viminfz.tmp 这种的临时文件&#xff0c;这是因为使用vim编辑器时&#xff0c;如果编辑器没有正常退出就会生成一个暂存文件&#xff0c;…

Flow深入浅出系列之更聪明的分享 Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之更聪明的分享 Kotlin Flows 使生命周期对上游流有效&#xff0c;以跳过不必要的工作。这是一…

使用kaliber与imu_utils进行IMU、相机+IMU联合标定

目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机IMU联合标定 4 将参数填入ORBSLAM的文件中 1 标定工具编译 1.1 IMU标定工具 imu_utils 标定IMU我们使用imu_utils软件进行标定…

Variations-of-SFANet-for-Crowd-Counting记录

论文&#xff1a;Encoder-Decoder Based Convolutional Neural Networks with Multi-Scale-Aware Modules for Crowd Counting 论文链接&#xff1a;https://arxiv.org/abs/2003.05586 源码链接&#xff1a;GitHub - Pongpisit-Thanasutives/Variations-of-SFANet-for-Crowd-C…

yarn : 无法加载文件 C:\Program Files\nodejs\yarn.ps1

问题描述&#xff1a; 问题分析&#xff1a; 这个错误提示说明在电脑系统上禁止运行 PowerShell 脚本&#xff0c;因此导致无法加载 Yarn 的安装脚本。这是由于系统的执行策略&#xff08;Execution Policies&#xff09;设置所导致的。 解决方法&#xff1a; 1. 以管理员身…

Ubuntu中不能使用ifconfig命令

​ 问题 打开终端使用如下命令不能运行&#xff1a; ifconfig显示如下错误: 解决方法 在VMware中的虚拟机下面打开“编辑虚拟机设置”&#xff0c;或者在已经打开的虚拟机面板上面打开“虚拟机—设置” 选择网络适配器&#xff0c;选择“NAT模式”&#xff0c;没开机的就…

Learning Sample Relationship for Exposure Correction 论文阅读笔记

这是中科大发表在CVPR2023的一篇论文&#xff0c;提出了一个module和一个损失项&#xff0c;能够提高现有exposure correction网络的性能。这已经是最近第三次看到这种论文了&#xff0c;前两篇分别是CVPR2022的ENC&#xff08;和这篇文章是同一个一作作者&#xff09;和CVPR20…

ardupilot开发 --- 起飞前后 篇

起飞前检查 电机响应是否正确&#xff08;转向&#xff09;姿态响应是否正常&#xff08;roll pitch yaw&#xff09;GPS数据是否正常&#xff08;星数&#xff0c;RTK信号&#xff09;电源电压安全开关安全检测&#xff08;armed pre check&#xff09; 起飞前的必调参数 机…

mmlab 做实验

首先 下载项目完整代码&#xff0c;在pycharm中打开 1. comfig 中有各种网络模型&#xff0c;可以直接使用训练好的预训练模型&#xff0c;尽量不要改动网络模型的结构 2. 18表示网络机构18层&#xff0c;8是每个卡的batch&#xff0c;cifar10 是数据集 3.配置文件解析 4. …

工业机器视觉系统构成及功能

工业机器视觉系统构成及功能 工业机器视觉系统由光源、光学传感器、图像采集设备、图像处理设备、机器视觉软件、辅助传感器、控制单元和执行机构等组件构成。 光源提供光线以辅助图像获取。 光学传感器将外部场景转换为电信号。 图像采集设备将信号转换为图像数据&#xf…

VSCode连接代理

VSCode连接代理 首先有代理 然后在设置里搜代理 然后再在windows的设置–>网络–>代理 拼接上就行 最后重启

【小尘送书-第八期】《小团队管理:如何轻松带出1+1>2的团队》

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…