MapReduce工作机制源码解析

news2024/10/11 11:00:50

目录

  • 1. MapTask工作机制
  • 2. ReduceTask工作机制
  • 3. ReduceTask并行度决定机制
  • 4. MapTask & ReduceTask源码解析

1. MapTask工作机制

MapTask一共分为五个阶段:Read、Map、Collect、溢写、Merge阶段。
在这里插入图片描述
在第4步MrAppMaster启动之前都是job的提交流程,从MrAppMaster启动之后开启对应的MapTask才真正进入MapTask阶段。
这里由于是200M数据,块大小是128M,会开启两个MapTask。
在这里插入图片描述

  • Read 阶段
    默认用 TextInputFormat 去读取数据,TextInputFormat 会调用 RecorderReader,RecorderReader再调用 reader() 去读取数据,解析出一个个 key/value,其中K对应偏移量,v 对应一行内容。(如果采用其他的 InputFormat则读取逻辑不一样,比如CombineTextInputFormat是读取一个文件)读完之后返回给map。

  • Map 阶段
    执行用户自己写的 map() 函数逻辑,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。

  • Collect 阶段——分区、排序
    环形缓冲区一侧存数据,一侧存索引,默认100M,这里的所有数据会按分区的方式进行存储,到达80%(默认阈值)后进行反向溢写,溢写之前会进行快速排序。(先按照分区编号Partition进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。)

  • 溢写阶段
    环形缓冲区到达阈值后会进行溢写(将数据写到本地磁盘上),生成大量的溢写文件(临时文件)(分区且区内有序)。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。(如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。)

  • Merge 阶段——归并排序
    溢写完之后会对所有的临时文件进行归并排序并合并,以确保每个MapTask 最终只会生成一个数据文件。
    在这里插入图片描述

2. ReduceTask工作机制

ReduceTask一共分为三个阶段:Copy、Sort、Reduce阶段。
在这里插入图片描述
每个MapTask已经把数据持久化到磁盘后,等待Reduce端拉取。ReduceTask闪亮登场。

  • Copy 阶段
    ReduceTask 拉取自己指定分区的数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

  • Sort 阶段
    对拉取过来的数据进行归并排序。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

  • Reduce 阶段
    相同的key进入reduce()函数,reduce()函数将计算结果写到HDFS上。

3. ReduceTask并行度决定机制

前面提到,MapTask并行度由切片个数决定,切片个数由输入文件和切片规则决定。
思考:ReduceTask并行度由谁决定?
(1) ReduceTask=0,表示没有Reduce阶段,输出文件个数和Map个数一致。
(2) ReduceTask默认值就是1,所以输出文件个数为一个。
(3) 如果数据分布不均匀,就有可能在Reduce阶段产生数据倾斜。
(4) ReduceTask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下需要计算全局汇总结果,就只能有1个ReduceTask。
(5) 具体多少个ReduceTask,需要根据集群性能而定。
(6) 如果分区数不是1,但是ReduceTask为1,是否执行分区过程。答案是:不执行分区过程。因为在MapTask的源码中,执行分区的前提是先判断ReduceNum个数是否大于1。不大于1肯定不执行。

4. MapTask & ReduceTask源码解析

MapTask源码解析流程

=================== MapTask ===================
context.write(k, NullWritable.get());   //自定义的map方法的写出,进入
output.write(key, value);  
	//MapTask727行,收集方法,进入两次 
collector.collect(key, value,partitioner.getPartition(key, value, partitions));
	HashPartitioner(); //默认分区器
collect()  //MapTask1082行 map端所有的kv全部写出后会走下面的close方法
	close() //MapTask732行
	collector.flush() // 溢出刷写方法,MapTask735行,提前打个断点,进入
sortAndSpill() //溢写排序,MapTask1505行,进入
	sorter.sort()   QuickSort //溢写排序方法,MapTask1625行,进入
mergeParts(); //合并文件,MapTask1527行,进入
	 
collector.close(); //MapTask739行,收集器关闭,即将进入ReduceTask

ReduceTask源码解析流程

=================== ReduceTask ===================
if (isMapOrReduce())  //reduceTask324行,提前打断点
initialize()   // reduceTask333行,进入
init(shuffleContext);  // reduceTask375行,走到这需要先给下面的打断点
        totalMaps = job.getNumMapTasks(); // ShuffleSchedulerImpl第120行,提前打断点
         merger = createMergeManager(context); //合并方法,Shuffle第80行
			// MergeManagerImpl第232 235行,提前打断点
			this.inMemoryMerger = createInMemoryMerger(); //内存合并
			this.onDiskMerger = new OnDiskMerger(this); //磁盘合并
rIter = shuffleConsumerPlugin.run();
		eventFetcher.start();  //开始抓取数据,Shuffle第107行,提前打断点
		eventFetcher.shutDown();  //抓取结束,Shuffle第141行,提前打断点
		copyPhase.complete();   //copy阶段完成,Shuffle第151行
		taskStatus.setPhase(TaskStatus.Phase.SORT);  //开始排序阶段,Shuffle第152行
	sortPhase.complete();   //排序阶段完成,即将进入reduce阶段 reduceTask382行
reduce();  //reduce阶段调用的就是我们自定义的reduce方法,会被调用多次
	cleanup(context); //reduce完成之前,会最后调用一次Reducer里面的cleanup方法


Over ~

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

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

相关文章

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车,卡车,交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…

构造mex(牛客周赛 Round 59)

题目链接; D-构造mex_牛客周赛 Round 59 (nowcoder.com) 题目描述: 输出和输出描述: 输入样例: 3 6 3 3 7 4 3 6 6 0 输出样例: NO YES 4 0 1 2 YES 1 1 1 1 1 1 分析: 数学思维题,赛后看了一…

Spring Cloud Bus:实现分布式系统中的消息传递与状态同步

在分布式系统中,服务之间的消息传递和状态同步是一个关键需求。Spring Cloud Bus提供了一个轻量级的消息代理连接分布式系统的节点,用于广播状态更改或管理指令。本文将探讨Spring Cloud Bus的功能、使用场景及其在分布式系统中的作用。 Spring Cloud B…

【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕

前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

Node.js+Express毕设论文选题最新推荐题目和方向

目录 一、前言 二、毕设选题推荐 三、总结 四、附录(手册、官网、资源教程等) 1. Node.js 官方资源 2. Express 官方资源 3.安装方法 4 创建示例 一、前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用…

ARM知识点三和串口代码的编写流程

ARM的一些常见问题 ARM 体系结构的主要特点是什么? 精简指令集 (RISC):ARM 采用 RISC 结构,指令集较小且简单,执行效率高。相比于复杂指令集 (CISC),RISC 更强调每条指令的执行速度。低功耗设计:ARM 处理…

在北京能不能设计一款可以多屏展示的调度桌

在北京这座科技与创新并蓄的国际大都市,设计一款集高效、智能与多屏展示功能于一体的调度桌,不仅是一个技术挑战,更是对未来工作场景的一次深刻探索与重塑。那么,在北京能不能设计一款可以多屏展示的调度桌呢? 随着信息技术的飞速…

实现MySQL异地多活场景

作为现代化的互联网企业 ,最怕的是什么 ?是意外!由各种意外导致的数据库问题,磁盘问题、网络问题、人员误操作问题等等,这些问题都可能导致数据不可用或者丢失,造成重大损失。 因此,很少会有企…

【吊打面试官系列-微服务面试题】微服务架构有哪些优势?

大家好,我是锋哥。今天分享关于【微服务架构有哪些优势?】面试题,希望对大家有帮助; 微服务架构有哪些优势? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构是一种软件架构风格,将单…

“Flash 闪存”基础知识及 “SD NAND Flash”产品测试指南

目录 “Flash 闪存”基础知识及 “SD NAND Flash”产品测试指南一、“FLASH闪存”是什么?1. 简介2. 分类3. 特点4. 虚拟化 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. STM32F103读写代码…

CorelDRAW中绘制居民地街道区道路网的绘制

居民地街区道路网的绘制 1.打开软件,点击【文件】→【新建】,建立实验。并导入底图,结果如图1所示: 图1 2.点击【手绘工具】,利用贝塞尔曲线绘制主干道,结果如下图2所示 图2 3.点击【手绘工具】&#xf…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第二十七章 交叉编译器的安装和使用

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

前后端分离开发YApid

开头先声明以下,这篇主要用于概念的介绍…… 在当今的互联网应用开发中,前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发,这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…

浏览器内置文字转语音,播报功能Web Speech API - SpeechSynthesisUtterance

SpeechSynthesisUtterance: 让网页说话的艺术 在现代Web开发中,让网页具有语音功能可以极大提升用户体验,特别是对于视障用户或需要多任务处理的场景。SpeechSynthesisUtterance 是 Web Speech API 中的一个接口,它允许开发者创建一个语音合…

初学java练习题【1】

import java.util.Scanner;public class HelloWorld{public static void main(String[] args){Scanner scannernew Scanner(System.in);//输入工资System.out.println("请输入您的工资:");double d1scanner.nextDouble();System.out.println("请输入…

Word 批注如何添加及删除?只需这样就行

在使用 Word 编写文档之后我们可能会将其发送给其他伙伴查看,当其看见文档中有错误的时候可能需要加以标记,这样你才能知道哪里有错误。Word 批注功能就是这样的一种工具,它允许用户在文档中标记特定文字或段落,并添加相关评论或建…

【论文阅读】Semi-Supervised Few-shot Learning via Multi-Factor Clustering

通过多因素聚类的半监督小样本学习 引用:Ling J, Liao L, Yang M, et al. Semi-supervised few-shot learning via multi-factor clustering[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022: 14564-14573. 论文地址…

微软已解决Word自动删除文件问题 重启或使用命令行可修复

早前作为办公软件主力产品的 Microsoft Word 出现某个错误,该错误会导致用户在保存文件后或者关闭 Word 时自动删除文件,好在文件只是被移动到回收站中而不是永久删除。 该问题主要影响以下行为: 文件名中包含 # 号 文件后缀为全大写的.DOC…

应对网络安全挑战:App等保测评的重要性与策略

在全球数字化转型的大潮中,移动应用(App)作为连接人们日常生活与互联网世界的桥梁,其数量与日俱增,功能日趋多样化。与此同时,App背后潜藏的网络安全风险也随之上升,数据泄露、隐私侵犯、恶意软件植入等问题频发&#…

访问控制列表(课内实验)

实验2:访问控制列表 实验目的及要求: 通过实验,进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念,熟练掌握标准ACL与扩展ACL的配置指令,掌握将访问控制列表应用VTY线路上,并且能够判断…