【大数据之Hadoop】十一、MapReduce之Shuffle、MapTask、ReduceTask工作机制

1 Shuffle机制

在这里插入图片描述
对于排序而言分为两个阶段,MapTask后和ReduceTask前。

2 MapTask工作机制

在这里插入图片描述
MapTask并行度由切片个数决定;切片个数由切片大小(切片大小取决于块大小、maxsize(Long的最大值)和minsize(默认为1))以及数据读取方式决定。
在这里插入图片描述
(1)Read阶段:
job的提交流程:待读写的源数据由客户端进行切片划分,划分完成之后提交(切片信息、jar包、xml配置文件)给yarn,yarn开启MrAppMaster。

MrAppMaster启动后正式开启MapTask,由InputFormat读取数据(默认使用TextInputFormat)调用RecorderReader的reader()读取数据,数据格式:(k,v)=(偏移量,数据的一行内容)。

读取之后将数据返回给Mapper,进入Map阶段。

(2)Map阶段:
主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。

(3)Collect收集阶段:
在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。

在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。

缓冲区内部的数据全部都是按照分区的方式进行存储,且一侧存数据,一侧存索引,当数据达到80%时进行反向溢写。溢写之前需要对分区中的数据进行排序

(4)Spill溢写阶段:
当环形缓冲区满后,产生大量的溢写文件,MapReduce会将数据写到本地磁盘上,生成一个临时文件。

将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。

(5)Merge阶段:
当所有数据处理完成后(即溢写完成后),MapTask所有临时文件(溢写文件)进行一次归并排序,以确保最终只会生成一个数据文件。
在这里插入图片描述
MapTask后的阶段:
MapTask把处理结果暂时放到环形缓冲区,当环形缓冲区的使用率达到一定阈值(80%)时,对其进行一次快速排序,然后将有序数据写到磁盘上。
当数据处理完后,磁盘上的所有文件再进行一次快速排序。

3 ReduceTask工作机制

在这里插入图片描述
前提:MapTask将数据处理完毕且持久化在磁盘上,等待ReduceTask端拉取数据。
(1)Copy阶段:
ReduceTask从各个MapTask上远程拷贝一片数据(即拉取指定分区的数据),并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2)Sort阶段:
对拉取的文件进行归并排序。
在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(3)Reduce阶段:
对于相同的key的数据进入到同一个reduce()处理函数,将计算**结果通过OutputFormat(输出)**写到HDFS上。
在这里插入图片描述
ReduceTask前的阶段:
ReduceTask从每个MapTask上拉取数据存储在内存上,如果文件太大则溢出写道磁盘。

如果磁盘上的文件数目达到一定阈值时,则进行一次归并排序,生成更大的文件。

如果内存中文件大小或者数目达到一定阈值时,也进行一次合并排序后写到磁盘上。

当所有数据拉取完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。

ReduceTask并行度决定机制
ReduceTask并行度一般通过实验得出,实验结果的总时间是服从正态分布的,具体多少个ReduceTask需要根据集群性能而定。

(1)ReduceTask=0,表示没有Reduce阶段,输出文件个数=Map个数。
(2)ReduceTask默认值=1,即输出文件为1个。
(3)当数据分布不均时,可能在Reduce阶段产生数据倾斜。
(4)ReduceTask个数需要根据业务逻辑需求设定。如计算全局汇总只能设置1个ReduceTask。
(5)当分区数不等于1,ReduceTask=1时不执行分区过程。原因:在MapTask源码中,执行分区前需要判断ReduceTask是否大于1,只有大于1时才执行分区。

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

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

相关文章

设计模式之模板模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、模板模式是什么? 模板模式是一种行为型的软件设计模式,在父类中定义了一个模板算法,只实现…

Android---MVC/MVP/MVVM的演进

目录 一个文件打天下 一个文件--->MVC MVC--->MVP MVP--->MVVM 6大设计原则 完整demo 我们通过"#字棋"游戏来展现MVC-->MVP-->MVVM 之间的演进 一个文件打天下 数据、视图以及逻辑都放在一个 class 里面。而一个 class 里最多 500 行代码&…

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…

Mybatis(七)Mybatis的日志体系

在介绍Mybatis日志实现前,我们先了解下java的日志体系以及日志框架的发展,目前比较常用的日志框架有下面几个: 而JCL和SLF4J属于日志接口(没有日志具体实现),提供统一的日志操作规范,而日志的实…

NumPy 秘籍中文第二版:四、将 NumPy 与世界的其他地方连接

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍以下秘籍: 使用缓冲区协议使用数组接口与 MATLAB 和 Octave 交换数据安装 RPy2与 R 交互安装 JPype将 NumPy 数组发送到 J…

什么是Lambda表达式?

什么是Lambda表达式 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 匿名:它不像普通的方法那样有一个明确的名称&#xff1…

GPT 任务指令 = 定义角色 + 背景信息 + 任务目标 + 输出要求

GPT 任务指令 定义角色 背景信息 任务目标 输出要求 环境 GPT-4 0. 你是一名专业的导游,负责为我生成旅游计划,现在我来北京旅游,需要你为我生成一份 3天2晚的北京旅游规划。我的要求是:1.地点包括故宫、军播和环球影城。 2…

pytorch搭建ResNet50实现鸟类识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章地址: 365天深度学习训练营-第J1周:ResNet-50算法实战与解析 🍖 作者:K同学啊 理论知识储备 深度残差网络ResNet(dee…

OceanBase 4.1 发版 | 一个面向开发者的里程碑版本

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 2022 年 8 月,OceanBase发布了 4.0 版本(小鱼),作为业内首个单机分布式一体化架构,兼顾了分布式架构的扩展性和集中式架构的性能优势&…

优思学院|职场达人有什么晋升秘诀?

作为职场人士,升职晋升是我们一直追求的目标。然而,在职场中,竞争是激烈的,只有那些真正做到了突出表现和积极进取的人才能获得晋升机会。这里将分享七个职场达人的晋升秘诀,希望对那些正在寻找升职机会的人有所帮助。…

Linux Shell 实现一键部署Nginx

nginx前言 nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由Igor Sysoev编写。很长一段时间以来,它一直在许多负载重的俄罗斯网站上运行,包括 Yandex、 Mail.Ru、 VK和 Rambler。根据 Netcraft …

Spring的创建与Bean对象的存取

文章目录:一.Spring项目的创建1.先创建maven项目 2.添加国内源 3.添加spring依赖 4.创建spring配置文件 5.创建启动类 二.Bean对象的创建和读取1.Bean对象的创建与存储方式(1)类注解 (2)方法注解 (3&#x…

【从零开始学Skynet】基础篇(五):简易聊天室

在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。1、功能需求 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到&#xf…

redis网络模型

用户空间和内核空间IO五种IO模型阻塞IO非阻塞IOIO多路复用selectpollepollweb服务流程信号驱动IO异步IOIO模型比较redis网络模型redis为什么是单线程redis单线程网络模型流程用户空间和内核空间 为安全,将用户应用和系统应用分隔开,产生用户空间和内核空…

OpenTex 企业内容管理平台

OpenText 企业内容管理平台 将内容服务与领先应用程序集成,弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成? 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来,支持并扩展了 ECM 的传统优势。 最好的内…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…

事件触发模式 LT ET ?EPOLLIN EPOLLOUT 各种情况总结。【面试复盘】【学习笔记】

麻了,对 epoll 的触发机制理解不深刻…面试又被拷打了… 下面总结一下各种情况,并不涉及底层原理,底层原理看这里。 文章结构可以看左下角目录、 有什么理解的不对的,请大佬们指点。 先说结论,下面再验证&#xff…

package-cli-service,为构建发布npm包提供完整的工作流

package-cli-service 介绍 package-cli-service 是一个开发环境依赖。它是一个 npm 包,局部安装在每个 create-package-tools 创建的项目中。 package-cli-service 是构建于 rollup 和 webpack 之上的。它包含了: 一个针对绝大部分 package 优化过的内…

013 - C++引用

本期我们要讲的是 C 中的引用。 上期我们讨论了指针,如果你没有看过那期内容,你一定要回去看看,因为引用实际上只是指针的扩展,你至少需要在基本层面上理解指针是如何工作的,然后才能继续学习本期的内容,本…

MySQL索引数据结构入门

之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点,因此松哥打算最近再抽空和小伙伴们…
最新文章