000010 - Mapreduce框架原理

Mapreduce框架原理

  • 1. InputFormat 数据输入
      • 1.1 切片与 MapTask 并行度决定机制
      • 1.2 Job 提交流程源码和切片源码详解
        • 1.2.1 Job 提交流程源码详解
        • 1.2.2 FileInputFormat 切片源码解析(input.getSplits(job))
      • 1.3 FileInputFormat 切片机制
        • 1.3.1 切片机制
        • 1.3.2 案例分析
        • 1.3.3 FileInputFormat切片大小的参数配置
      • 1.4 FileInputFormat的实现类
        • 1.4.1 TextInputFormat
        • 1.4.2 CombineTextInputFormat
  • 2. MapReduce 工作流程

在这里插入图片描述

1. InputFormat 数据输入

1.1 切片与 MapTask 并行度决定机制

1)问题引出
MapTask 的并行度决定 Map 阶段的任务处理并发度,进而影响到整个 Job 的处理速度。

思考:1G 的数据,启动 8 个 MapTask,可以提高集群的并发处理能力。那么 1K 的数据,也启动 8 个MapTask,会提高集群性能吗?MapTask 并行任务是否越多越好呢?哪些因素影响了 MapTask 并行度?

2)MapTask 并行度决定机制

  1. 数据块:Block 是 HDFS 物理上把数据分成一块一块。数据块是 HDFS 存储数据单位。
  2. 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是 MapReduce 程序计算输入数据的单位,一个切片会对应启动一个MapTask。
    在这里插入图片描述

1.2 Job 提交流程源码和切片源码详解

1.2.1 Job 提交流程源码详解

在这里插入图片描述

1.2.2 FileInputFormat 切片源码解析(input.getSplits(job))
  1. 程序先找到你数据存储的目录。
  2. 开始遍历处理(规划切片)目录下的每一个文件
  3. 遍历第一个文件ss.txt
    3.1 获取文件大小fs.sizeOf(ss.txt)
    3.2 计算切片大小 - computeSplitSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
    3.3 默认情况下,切片大小=blocksize
    3.4 开始切,形成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片)
    3.5 将切片信息写到一个切片规划文件中
    3.6 整个切片的核心过程在getSplit()方法中完成
    3.7 InputSplit只记录了切片的元数据信息,比如起始位置、长度以及所在的节点列表等。
  4. 提交切片规划文件到YARN上,YARN上的MrAppMaster就可以根据切片规划文件计算开启MapTask个数。

1.3 FileInputFormat 切片机制

1.3.1 切片机制

(1)简单地按照文件的内容长度进行切片
(2)切片大小,默认等于Block大小
(3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

1.3.2 案例分析

(1)输入数据有两个文件:

file1.txt 320M
file2.txt 10M

(2)经过FileInputFormat的切片机制运算后,形成的切片信息如下:

file1.txt.split1-- 0~128
file1.txt.split2-- 128~256
file1.txt.split3-- 256~320
file2.txt.split1-- 0~10M

1.3.3 FileInputFormat切片大小的参数配置

(1)源码中计算切片大小的公式
Math.max(minSize, Math.min(maxSize, blockSize));
mapreduce.input.fileinputformat.split.minsize=1 默认值为1
mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue 默认值Long.MAXValue
因此,默认情况下,切片大小=blocksize。
(2)切片大小设置
maxsize(切片最大值):参数如果调得比blockSize小,则会让切片变小,而且就等于配置的这个参数的值。
minsize(切片最小值):参数调的比blockSize大,则可以让切片变得比blockSize还大。
(3)获取切片信息API
// 获取切片的文件名称
String name = inputSplit.getPath().getName();
// 根据文件类型获取切片信息
FileSplit inputSplit = (FileSplit) context.getInputSplit();

1.4 FileInputFormat的实现类

思考:在运行 MapReduce 程序时,输入的文件格式包括:基于行的日志文件、二进制
格式文件、数据库表等。那么,针对不同的数据类型,MapReduce 是如何读取这些数据的呢?
FileInputFormat 常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、
NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等。

1.4.1 TextInputFormat

TextInputFormat 是默认的 FileInputFormat 实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable 类型。值是这行的内容,不包括任何行终止 符(换行符和回车符),Text 类型。
以下是一个示例,比如,一个分片包含了如下 4 条文本记录。

Rich learning form
Intelligent learning engine
Learning more convenient
From the real demand for more close to the enterprise

每条记录表示为以下键/值对:

(0,Rich learning form)
(20,Intelligent learning engine)
(49,Learning more convenient)
(74,From the real demand for more close to the enterprise)
1.4.2 CombineTextInputFormat

框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。

1)应用场景:

CombineTextInputFormat 用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。

2)虚拟存储切片最大值设置

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。

3)切片机制

生成切片过程包括:虚拟存储过程和切片过程二部分。

下面是一个例子:
1)输入文件

a.txt 1.7M
b.txt 5.1M
c.txt 3.4M
d.txt 6.8M

2)虚拟存储过程

1.7M<4M 划分为一块 : 1.7M
5.1M>4M 但是小于24M 划分为二块 : 2.55M 2.55M
3.4M<4M 划分为一块 : 3.4M
6.8M>4M 但是小于2
4M 划分为二块 : 3.4M 3.4M
最终存储的文件一共6块,分别为1.7M 2.55M 2.55M 3.4M 3.4M 3.4M

3)切片过程

(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
最终会形成3个切片,大小分别为:(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M

2. MapReduce 工作流程

在这里插入图片描述
在这里插入图片描述
上面的流程是整个 MapReduce 最全工作流程,但是 Shuffle 过程只是从第 7 步开始到第
16 步结束,具体 Shuffle 过程详解,如下:
(1)MapTask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key 进行排序
(5)ReduceTask 根据自己的分区号,去各个 MapTask 机器上取相应的结果分区数据
(6)ReduceTask 会抓取到同一个分区的来自不同 MapTask 的结果文件,ReduceTask 会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle 的过程也就结束了,后面进入 ReduceTask 的逻辑运算过程(从文件中取出一个一个的键值对 Group,调用用户自定义的 reduce()方法)注意:

注:
(1)Shuffle 中的缓冲区大小会影响到 MapReduce 程序的执行效率,原则上说,缓冲区 越大,磁盘 io 的次数越少,执行速度就越快。
(2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb 默认 100M。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot个性化图书推荐系统的设计与实现

基于Springboot个性化图书推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

兴业周报|央行宣布“有力度的降息”他来了

耕天下4号楼1单元5-103室&#xff08;复式&#xff09; 稀有户型&#xff1a;标的物为二环内南北通透4居室复式&#xff0c;低密度花园洋房&#xff0c;小区中心位置&#xff0c;前后不临街。 黄金地段&#xff1a;耕天下东接天坛公园、西靠陶然亭公园、南临南护城河、北抵先…

基于微信小程序二手物品调剂系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个…

优雅的入参校验,Valid常用校验

更好的阅读体验&#xff1a;优雅的入参校验&#xff0c;Valid常用校验 对于前端传递的参数&#xff0c;正常情况下后端是要进行一些必要的校验&#xff0c;最简单的做法是用 if 效果是可以&#xff0c;但不优雅。使用 Validator 代替 if&#xff0c;就会优雅很多 ps&#xff…

【从零开发Mybatis】引入MapperConfig.xml和Mapper映射配置

引言 学习MyBatis源码之前&#xff0c;了解它是如何通过JDBC查询数据库数据的基础知识是非常有用的。 上一篇我们编写了一个最简单的示例&#xff0c;通过JDBC查询数据库数据&#xff0c;从本文开始&#xff0c;我们将正式开始Mybatis框架的开发。 通过JDBC查询数据库数据存…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…

改变函数调用上下文:apply与call方法详解及实例

目录 改变函数调用上下文&#xff1a;apply与call方法详解及实例 一、什么是 apply 方法&#xff1f; 1、apply 语法 2、apply 示例 二、什么是 call 方法&#xff1f; 1、call 语法 2、call 示例 三、apply 和 call 的共同与差异 1、apply 和 call 的共同点 2、apply…

opencv学习:基于计算机视觉的表情识别系统

简介 基于计算机视觉的表情识别系统&#xff0c;该系统能够从视频流中实时检测人脸&#xff0c;并识别出两种基本表情&#xff1a;大笑和微笑。实验通过分析人脸关键点来计算表情特征指标&#xff0c;从而判断表情类型。 原理 基于以下原理进行&#xff1a; 人脸检测&#x…

Transformer(Vit+注意力机制)

文献基本信息&#xff1a; Encoder-Decoder&#xff1a; Transformer的结构&#xff1a; 输入编码器解码器输出 Transformer的工作流程&#xff1a; 获取输入句子的每一个单词的表示向量X&#xff0c;X由单词的embedding&#xff08;embedding是一种将高维特征映射到低维的技…

机器学习中的图像处理与计算机视觉

引言 在现代计算机科学中&#xff0c;图像处理和计算机视觉已成为最活跃的研究领域之一&#xff0c;这得益于机器学习和深度学习的发展。本文将深入探讨图像处理与计算机视觉的基础概念、常见应用、关键技术、常用工具&#xff0c;以及在这些领域中的代码示例。通过本篇文章&a…

约80%的巴西消费者热捧跨境电商平台Shopee

巴西作为南美洲最大的经济体&#xff0c;拥有庞大的消费群体和日益增长的消费需求。随着互联网的普及和电子商务的快速发展&#xff0c;巴西消费者对海外商品的兴趣日益浓厚。他们渴望获得更多元化的商品选择&#xff0c;尤其是那些在国内难以找到的特色商品或国际知名品牌。这…

Python3 接口自动化测试,HTTPS下载文件(GET方法和POST方法)

Python3 接口自动化测试,HTTPS下载文件(GET方法和POST方法) requests-pkcs12 PyPI python中如何使用requests模块下载文件并获取进度提示 1、GET方法 1.1、调用 # 下载客户端(GET)def download_client_get(self, header_all):try:url = self.host + "/xxx/v1/xxx-mod…

DBdoctor推出无Agent轻量级纳管解决方案

目录 背景 DBdoctor推出无Agent轻量级纳管解决方案 方案优势&#xff1a; 实例纳管方式&#xff1a; 无Agent纳管可体验哪些功能&#xff1f; 1.全量SQL审核功能 2.实例巡检功能 3.性能洞察功能 4.基础监控功能 总结 背景 在数字化时代&#xff0c;数据库作为信息系…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

unity 屏幕波动反馈打击效果(附资源下载)

unity 屏幕波动反馈打击效果 一枪打出去整个屏幕都回波动的效果反馈。 知识点&#xff1a; 1、动画事件 2、屏幕后处理 效果如图&#xff1a;&#xff08;波动速度浮动都可调整&#xff09; 附件下载

[C#][winform]基于yolov8的DMS驾驶员抽烟打电话喝水吃东西检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

EWM 库存盘点

目录 1 业务流程图 2 后台配置 & 主数据 3 业务操作 1 流程图 2 后台配置 & 主数据 仓库活动区域设置 SCM Extended Warehouse Management -> Extended Warehouse Management -> Internal Warehouse Processes -> Physical Inventory -> Physical-Inv…

k8s-pod详解

Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程 pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#xff08;post st…

C语言【调试】(个人笔记版)

调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记&#xff1a; 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…