hadoop之MapReduce框架原理

news2024/11/24 0:04:42

bbf48a5f21c2b1999ba1bd00b528c9e6.jpeg

 

目录

MapReduce框架的简单运行机制:

Mapper阶段: 

InputFormat数据输入:

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

job提交过程源码解析:

切片逻辑:

1)FileInputFormat实现类

进行虚拟存储

(1)虚拟存储过程:

Shuffle阶段:

排序:

 Combiner合并:

 ReduceTask阶段:

Reduce Join:

Map Join:


MapReduce框架的简单运行机制:

MapReduce是分为两个阶段的,MapperTask阶段,和ReduceTask阶段。(中间有一个Shuffle阶段)

Mapper阶段,可以通过选择什么方式(K,V的选择对应不同的方法)来读取数据,读取后把数据交给Mapper来进行后续的业务逻辑(用户写),让后进入Reduce阶段通过Shuffle来拉取Mapper阶段的数据,让后通过OutputFormat(等方法)来写出(可以是ES,mysql,hbase,文件)

Mapper阶段: 

InputFormat数据输入:

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

MapTask个数,决定了并行度(相当于在生成map集合的过程中有几个人在干活),**(不一定越多越好,当数据量小的时候可能开启的众多MapTask的时间用一个MapTask已经计算完成)

数据块:BlockHDFS物理把数据分成一块一块。数据块是HDFS存储数据单位

数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。

 

job提交过程源码解析:

因为我们找的job提交,所以在job提交函数哪里打个断点,

步入函数后   

ensureState(JobState.DEFINE);  是确保你的状态是正确的(状态不对或者running 都会抛异常)
setUseNewAPI();       处理Hadoop不同版本之间的API兼容
connect();          连接,(客户端需要与集群或者本机连接)
checkSpecs(job); 校验 校验输出路径是否已经创建,是否有参

return submitter.submitJobInternal(Job.this, cluster);   核心代码    步入的时候需要点两下,

第一个步入是步入的参数Job  第二个才步入此方法 

这个方法是提交job(在集群模式下,提交的job包含(通过客户端方式把jar包提交给集群),在本地不需要提交jar包,jar在本地是存在的)

还会进行切片,生成切片信息(几个切片就有几个MapTask)

还会 生成xml文件

综上  job提交会交三样东西(jar,xml文件,切片信息---》集群模式下)

最后会删除所有的信息文件

切片逻辑:

**(切片是每一个文件单独切片)

在本地是32m一块,前边说过,默认一块对应一个切片,但是有前提条件,再你减去32m的时候,余下最后一块如果大于1.1倍就重新分配切片,但如果小于1.1,则不能更新分片

例子1:

已有一个32.1m的数据   物理分块是(32m+0.1m)切片分布是(1个切片,因为32.1/32=1.003125<1.1   所以使用一个切片)

例子2:

已有一个100m的数据

100-32-32=36>32(36/32=1.125>1.1   所以最后36m需要分配两个切片)

**块的大小没办法改变,但是可以调切片大小(maxSize让切片调小)(minSize让切片调大)

切片总结:

(开一个MapTask  默认是占1g内存+1个cpu)

  

1FileInputFormat实现类

思考:在运行MapReduce程序时,输入的文件格式包括:基于行的日志文件、二进制格式文件、数据库表等。那么,针对不同的数据类型,MapReduce是如何读取这些数据的呢?

FileInputFormat常见的接口实现类包括TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。(应用场景的不同选择不同的接口实现类)

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

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

进行虚拟存储

(1)虚拟存储过程:

将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize(切片大小)值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现小切片)

 测试:

再不使用CombineTextInputFormat情况下(默认TextInputFormat)  

 可以看到切片为4

添加代码,设置实现类为CombineTextInputFormat     和   设置虚拟存储切片大小

// 如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);

//虚拟存储切片最大值设置4m
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

  

 可以看到,现在是3个切片

我们可以通过改变虚拟切片大小来改变调用的切片的数量

综上:影响切片的数量的因素为:(1)数据量的大小(2)切片的大小(一般会自动调整)(3)文件格式(有些文件是不可切片的)

影响切片大小的因素:   HDFS中块的大小(通过调maxsize,minsize与块的大小进行比较来判断)

Shuffle阶段:

shuffle阶段是一个从mapper阶段出来的后的阶段,会写入(k,v)一个环形缓冲区(缓冲区分为两半,一半存储索引,一半存储数据,默认100m,到达80%后会反向逆写(减少时间消耗,提高效率,逆写是因为不需要等待全部溢写后在进行写入操作)逆写入文件前会进行分区(分区的个数与reduceTask的个数有关)排序(对key进行排序,但是存储位置并不发生改变,只改变索引的位置,改变存储位置消耗资源较大))写入文件后会进行归并排序(在有序的情况下,归并是最高效的))

排序:

排序可以自定义排序,举例全排序:

自定义了一个Bean类,bean对象做为key传输,需要实现WritableComparable接口重写compareTo方法,就可以实现排序。

 Combiner合并:

并不满足所有生产环境下,只有在不影响最终业务逻辑下才可以实现(求和就可以,算平均值就不可以) 

combiner与reducetask区别如下:

 ReduceTask阶段:

(1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

(2)Sort阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

(3)Reduce阶段:reduce()函数将计算结果写到HDFS上。

ReduceTask的个数可以手动进行设置,设置几就会产生几个文件(分区同上)

Reduce Join:

简述流程:

(1)自定义bean对象(序列化反序列化函数---implements Writable)

(2)写mapper类     先重写setup方法(因为本案例需要两个文件,初始化(读多个文 希望先获取到文件名称(多文件) 一个文件一个切片   setup方法是一个优化手段 获取文件名称)

(3)写reduce类(业务逻辑)   先创建一个集合(类型为bean类型)和bean对象用于存储

用for循环遍历value(key是一样的  一样的key才会进入同一个reduce方法)

获取文件名判断写出不同的业务逻辑

"order"表:

先创建一个bean对象,用于存储数据,用于后续写入集合

用到方法   BeanUtils.copyProperties(tmpOrderBean,value);  获取原数据

让后加入上述创建的集合 orderBeans.add(tmpOrderBean);

“pd”表:
BeanUtils.copyProperties(pdBean,value);直接获取原数据

存储结束,结合阶段:

使用增强for

orderbean.setPname(pdBean.getPname());

使用set函数直接设置集合中的pname

让后写入

context.write(orderbean,NullWritable.get());
业务结束

Reduce Join的缺点:这种方式中,合并的操作是在Reduce阶段完成,Reduce端的处理压力太大,Map节点的运算负载则很低,资源利用率不高,且在Reduce阶段极易产生数据倾斜。

Map Join:

使用场景

Map Join适用于一张表十分小、一张表很大的场景。

Map端实现数据合并就解决了Reduce Join的缺点(数据倾斜)

简述流程:

在map类中

setup方法:将较小文件读入缓存,将数据存储到全局的map集合中,将缓存中的数据全部写入

重写的map方法中:

转换成字符串在切割,通过切割后的数组获取map集合中的pname

让后重新设置输出文件的格式进行写出

(至此mapreduce完结!!!!)

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

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

相关文章

9.Nuxt.js的使用

九.Nust.js的使用 1.什么是SEO 2.百度的搜索结果 3.服务器端和客户端渲染 4.Nuxt.js技术简介 5.Nuxt.js的路由&#xff08;使用提供的nuxt-app项目初始化&#xff09; 6.Nuxt.js的页面布局和整体配置 7.Nuxt.js整合axios 九.Nust.js的使用 1.什么是SEO ①SEO SEO是通…

elasticSearch数据存储与搜索基本原理

1.缘起&#xff1a; 为啥想学习es&#xff0c;主要是在工作中会用到&#xff0c;但是因为不了解原理&#xff0c;所以用起来畏手畏脚的&#xff0c;就想了解下es是怎么存储数据&#xff0c;以及es是怎么搜索数据的&#xff0c;我们平时应该如何使用es&#xff0c;以及使用时候…

springboot+jwt令牌简单登录案例

1. 什么是JWT&#xff1f;JSON Web Token JSON Web Token (JWT)是⼀个开放标准(RFC 7519)&#xff0c;它定义了⼀种紧凑的、⾃包含的⽅式&#xff0c;⽤于 作为JSON对象在各⽅之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 1.1 什么时候应该⽤…

【Linux】应用层协议—http

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

DevData Talks | 微众银行有哪些研发效能实践与思考?一起来拓展认知边界!

本期 DevData Talks 直播活动中&#xff0c;我们非常高兴地邀请到了微众银行研发效能负责人余伟老师与我们分享微众银行在研发效能实践方面的经验与方法。 微众银行是一家面向互联网的银行&#xff0c;从诞生之日起就一直致力于快速迭代、稳健可靠的业务支持。面对金融和互联网…

ORACLE EBS 系统架构与应用实践(二)

四、ORACLE EBS的系统集成性 这里的所谓系统“集成性”&#xff0c;既非指“技术层面”的集成&#xff0c;也非指模块“应用层面”的集成&#xff0c;而是指企业管理发展过程中内在“核心要素”的集成。有人以为&#xff0c;一个ERP产品所包含的模块数量足够多、企业上线的模块…

【大数据基础】基于信用卡逾期数据的Spark数据处理与分析

https://dblab.xmu.edu.cn/blog/2707/ 实验过程 数据预处理 本次实验数据集来自和鲸社区的信用卡评分模型构建数据&#xff0c;以数据集cs-training.csv为分析主体&#xff0c;其中共有15万条记录&#xff0c;11列属性。 每个数据包含以下字段&#xff1a; 字段名称 字段含义…

【PyTorch】第四节:梯度下降算法

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

java--HtmlUnit--模拟浏览器操作--自动化操作浏览器--自动登录校园网为案例

写在前面&#xff1a; 闲来无事&#xff0c;因为宿舍每次嫌登录校园网有点免费。然后想着能不能一键自动化实现。然后更麻烦了&#xff0c;哈哈哈。不过倒是写一次代码就可以了。 可能不是特别系统&#xff0c;因为资料太少了。都是案例驱动找的资料。花了3大节课才搞完了。 会…

Redis运维之swap影响及解决方案

一、操作系统SWAP swap空间对于操作系统来说比较重要&#xff0c;当我们使用操作系统的时候&#xff0c;如果系统内存不足&#xff0c;常常会将一部分内存数据页进行swap操作&#xff0c;以解决临时的内存困境。swap空间由磁盘提供&#xff0c;对于高并发场景下&#xff0c;sw…

全球土壤湿度数据获取方法

土壤湿度亦称土壤含水率&#xff0c;表示土壤干湿程度的物理量。是土壤含水量的一种相对变量。通常用土壤含水量占干土重的百分数是示&#xff0c;亦称土壤质量湿度&#xff0c;如用土壤水分容积占土壤总容积的百分数表示&#xff0c;则称土壤容积湿度。通常说的土壤湿度&#…

Vivado中VIO IP核的使用

Vivado中VIO IP核的使用一、写在前面二、VIO IP核配置三、VIO联调四、写在后面一、写在前面 Vivado中的VIO&#xff08;Virtual Input/Output&#xff09; IP核是一种用于调试和测试FPGA设计的IP核。它允许设计者通过使用JTAG接口读取和写入FPGA内部的寄存器&#xff0c;从而检…

【JavaEE】关于synchronized总结-Callable用法及JUC的常见问题

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶synchronized原理是什么&#xff1f;synchronized到底有什么特点&#xff0c;synchronized的锁策略是什么&#xff0c;是怎么变化的呢&#xff1f;本篇文章总结出, Synchronized 具有以下特性…

【Java|golang】1041. 困于环中的机器人

在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”&…

Markdown 语法大全

Markdown是一种轻量级标记语言&#xff0c;常用于撰写博客、文档、论文等。它可以让你使用易读易写的纯文本格式来编写文档&#xff0c;然后通过转换成有效的HTML文档进行发布。以下是Markdown常用的语法&#xff1a; 这里写目录标题标题列表引用一级引用嵌套引用粗体和斜体删除…

技术复盘(1)--redis

技术复盘--redis技术复盘(1)--redis资料地址准备工作发展史redis-windowsredis-windows-说明redis-centos7安装jdk安装redisredis-key基本命令redis-string命令redis-list命令redis-set命令redis-hash命令redis-zset命令redis-geospatial命令redis-hyperloglog命令redis-bitmap…

【Linux驱动开发】024 INPUT子系统

一、前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如…

文本聚类与摘要,让AI帮你做个总结

你好&#xff0c;我是徐文浩。 上一讲里&#xff0c;我们用上了最新的ChatGPT的API&#xff0c;注册好了HuggingFace的账号&#xff0c;也把我们的聊天机器人部署了出去。希望通过这个过程&#xff0c;你对实际的应用开发过程已经有了充足的体验。那么这一讲里&#xff0c;我们…

[目标识别-论文笔记]Object Detection in Videos by Short and Long Range Object Linking

文章标题&#xff1a;2018_Cite13_Tang——Object Detection in Videos by Short and Long Range Object Linking 这篇论文也被叫做“2019_Cite91_TPAMI_Tang——Object Detection in Videos by High Quality Object Linking” 如果这篇博客对你有帮助&#xff0c;希望你 点赞…

ES索引库操作

文章目录1、对索引库的操作&#xff1a;创建、删除、查看2、文档操作3、 RestClient操作索引库4、利用RestClient实现文档的CRUD5、 批量导入功能有了索引库相当于数据库database&#xff0c;而接下来&#xff0c;就是需要索引库中的类型了&#xff0c;也就是数据库中的表&…