当前位置: 首页 > news >正文

Hadoop3教程(二十):MapReduce的工作机制总结

文章目录

  • (109)MapTask工作机制
  • (110)ReduceTask工作机制&并行度
    • ReduceTask工作机制
    • MapTask和ReduceTask的并行度决定机制
  • (122)MapReduce开发总结
  • 参考文献

(109)MapTask工作机制

MapTask的完整工作流程如图:

在这里插入图片描述

依图可见,MapTask一共分为5个阶段:

  • Read阶段
  • Map阶段
  • Collect阶段
  • 溢写阶段
  • Merge阶段

1) Read阶段:首先是job的提交流程,客户端会读取待处理文件的信息,然后做切片规划,接着把信息和切片规划都提交到YARN,YARN会计算出所需要的MapTask的数量,之后才会正式进入MapTask;

MapTask会调用InputFormat读取数据,K是偏移量,v是这一行的文本,这就是Read阶段;

2) Map阶段,会进入自定义Mapper,执行我们在map()里定义的业务逻辑;

3) Collect阶段。把Map阶段处理的数据,通过调用OutputCollector.collect()来持续的发送到环形缓冲区,这个过程中会给每个KV对打上分区标记;

4) Spill阶段,即溢写阶段。当缓冲区写到80%之后,触发溢写,MR会将环形缓冲区的数据排序后写到本地磁盘上,生成一个临时文件。

4.1) 溢写时,首先使用快速排序算法,对缓冲区内的数据进行排序。排序的方式是,先按照分区编号Partition进行排序,然后再按照key进行排序。经过这样排序之后,数据以分区为单位聚集在一起,同时区内数据是按照key有序;

4.2) 按照分区编号从小到大依次将每个分区的数据写入临时文件output/spillN.out中,其中N表示当前溢写的次数。如果设置了Combiner,则会先进行分区内Combiner之后,再写入文件;

4.3) 将分区数据的元信息写到内存索引数据结构spillRecord中,其中每个分区数据的元信息包括:在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。方便后续按照分区提取数据。如果当前内存索引大小占用超过1MB,则会将内存索引写到output/spillN.out.index里。

5) Merge阶段。当前MapTask的所有数据处理完成后,会对自己溢写输出的所有文件做归并,确保最终只生成一个数据文件。(避免小文件创建和读取的开销)

最终的大文件合并完成后,MapTask会将其保存到output/file.out里,同时生成相应的索引文件output/file.out.index

在文件合并过程中,是以分区为单位进行合并。对于某个分区,采用多轮递归合并的方式,每轮合并mapreduce.task.io.sort.factor(默认为10)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。

(110)ReduceTask工作机制&并行度

ReduceTask工作机制

ReduceTask的完整工作流程如下图:

在这里插入图片描述

由图可知,ReduceTask分为3个阶段:

  • Copy阶段
  • Sort阶段(或者是merge + sort阶段)
  • Reduce阶段

1) Copy阶段,每个ReduceTask负责处理一个分区的数据,首先每个ReduceTask会从各个MapTask归并完的文件里,将对应分区的数据拷贝过来。相当于是从每个MapTask都取一片数据,如果这片数据大小超过阈值,那么就写到磁盘上,否则就直接放进内存里。

2) 接下来进入Sort阶段,每个ReduceTask会对自己拉取过来的那堆数据,做归并排序。

ReduceTask在远程拷贝数据的同时,也会启动两个后台线程,对内存和磁盘上的文件进行合并,以防止内存中数据过多,或者磁盘上文件过多。由于每个MapTask对自己的数据已经进行了局部排序,因此ReduceTask只需要对拿到的所有数据进行一次归并排序即可。(子序列有序,合并多个子序列的算法)

3) 最后进入Reduce阶段,将上一阶段的文件送进Reduce()里,执行自定义的业务逻辑,并调用绑定的OutputFormat,将处理结果以指定形式输出到指定介质。

MapTask和ReduceTask的并行度决定机制

MapTask并行度是由切片个数决定的,而切片个数则是由输入文件和切片规则决定的。

那ReduceTask的并行度是由谁决定的?

ReduceTask的数量是可以手动设置的,通过在驱动类里编写如下代码:

job.setNumReduceTasks(4);		// 设置为4个ReduceTask

设置ReduceTask数量=0的时候,表示没有reduce阶段,输出文件个数跟map阶段一致。

如果数据分布不均匀的话,就有可能在Reduce阶段产生数据倾斜(单个分区数据过多,导致与其对应的ReduceTask处理压力过大),这个可以实际观察一下。

如果分区数不是1,但是设置的ReduceTask数量是1,那么将不会执行分区阶段。因为分区的时候会先判断ReduceTaskNum是否大于1,不大于1就不会执行分区逻辑。这个其实之前的时候也有讲过来着。

既然ReduceTask的数量是需要人为指定的,那么这个数量设置多少比较合适?

只能说不一定,需要考虑业务的需求,还需要结合集群的性能,来综合评定。

在有的情况下,需要计算全局汇总结果,那就只有一个ReduceTask就够了。

教程里做了一个简单的测试,我直接贴一下:

实验环境:1个Master节点,16个Slave节点,CPU都是8GHZ,内存都是2G。

当处理1GB数据时,改变ReduceTask的数量,总处理时长的变化为:

MapTask =16
ReduceTask151015162025304560
总时间8921461109288100128101145104

所以可以看到,一般来讲,ReduceTask的数量,不是越多越好,同样的,也不是越少越好。还是得视情况具体分析。

(122)MapReduce开发总结

接下来,按照执行的顺序,简单过一下MR处理过程中涉及到的一些组件,或者说一些环节:

1) 输入数据接口:InputFormat

默认的是TextInputFormat,输入的K是偏移量(功能上可简单理解成行号,但其实不是),V是对应的一行内容。但是一个文件至少占一片,因此处理不了大量小文件的场景。

处理大量小文件时应该用CombineTextInputFormat,可以把多个文件合并在一起统一切片,其中会涉及虚拟存储的概念;

2)逻辑处理接口:Mapper

数据进入Mapper之后,会按顺序执行下面三个方法:

  • setup(),负责初始化
  • map(),用户的业务逻辑
  • cleanup(),最后调用,关闭资源;

之后,数据进入到shuffle阶段。

3)分区:Partitioner

默认的是HashPartitioner,即按照key的hashcode值 % numReducer个数来计算key所属分区。

可根据业务需要,自定义分区类。

4)排序:Comparable

MR中的排序默认是字典排序,即按照字母或者数字,由小到大排序。
不同场景下的排序,拥有不同的名字:

  • 部分排序:即每个输出的文件,内部有序,文件和文件之间无序;
  • 全排序:相当于一个Reduce,对所有数据排序,慎用,所有数据放在一台节点上,容易OOM;
  • 二次排序:即拥有两个排序条件,它属于自定义排序的范畴,需要实现WritableCompare接口,并重写其中的compareTo()来添加大小比较的逻辑;

5)合并:Combiner(可选阶段)

Combiner其实是一类运行在单个MapTask的Reducer。

通过在shuffle的几个阶段里做预聚合,如可以将(a,1)、(a,1)这样的数据聚合成(a,2),从而减少数据量,避免无谓的IO传输。

前提是不影响最终的业务逻辑(求和没啥问题),其实就是提前在map阶段聚合,这样算是降低了Reducer端的压力,这也是解决数据倾斜的一个方法。

同样的,Combiner也可以自定义,可编写自己需要的、同时不影响业务的聚合逻辑。

6)逻辑处理接口:Reducer

数据进入Reducer之后,会按顺序执行下面三个方法:

  • setup() 初始化
  • reduce() 用户的业务逻辑;
  • clearup() 关闭清理资源

7)输出数据接口:OutputFormat

默认是TextOutputFormat,即将每个KV对,作为一行输出到目标文件;同样支持自定义。

参考文献

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

相关文章:

Hadoop3教程(二十):MapReduce的工作机制总结

文章目录 (109)MapTask工作机制(110)ReduceTask工作机制&并行度ReduceTask工作机制MapTask和ReduceTask的并行度决定机制 (122)MapReduce开发总结参考文献 (109)MapTask工作机制…...

浅谈AI大模型技术:概念、发展和应用

AI大模型技术是指使用超大规模的深度学习模型来解决各种复杂的人工智能问题,如自然语言处理、计算机视觉、多模态交互等。AI大模型技术具有强大的学习能力和泛化能力,可以在多种任务上取得优异的性能,但也面临着计算、存储、通信等方面的挑战…...

【Leetcode】212.单词搜索II(Hard)

一、题目 1、题目描述 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中…...

146.LRU缓存

双向链表哈希表 class LRUCache { public://1、定义双向链表结构、容量、哈希表等LRU数据成员struct Node{int key,value;Node *left,*right;Node(int _key,int _value):key(_key),value(_value),left(NULL),right(NULL){}}*L,*R;int n;unordered_map<int,Node*> ump;//…...

使用transformers过程中出现的bug

1. The following model_kwargs are not used by the model: [encoder_hidden_states, encoder_attention_mask] (note: typos in the generate arguments will also show up in this list) 使用text_decoder就出现上述错误&#xff0c;这是由于transformers版本不兼容导致的 …...

Hadoop3教程(二十二):Yarn的基础架构与工作流程

文章目录 &#xff08;126&#xff09;基础架构&#xff08;127&#xff09;YARN的工作机制&#xff08;128&#xff09;作业全流程参考文献 &#xff08;126&#xff09;基础架构 之前基本介绍完了Hadoop的几个核心组件&#xff0c;接下来可以思考下&#xff0c;在MR程序运行…...

离线 notepad++ 添加到右键菜单

复制下面代码&#xff0c;修改文件后缀名为&#xff1a;reg Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\Notepad\\notepad.exe,0"[HKEY_CLASSES_ROOT\*\shell\NotePad\Command] "D:\…...

怎么让英文大语言模型支持中文?--构建中文tokenization--继续预训练--指令微调

1 构建中文tokenization 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/639144223 1.1 为什么需要 构建中文tokenization&#xff1f; 原始的llama模型对中文的支持不太友好&#xff0c;接下来本文将讲解如何去扩充vocab里面的词以对中文进行token化。 1.2 如何对 原始数…...

笙默考试管理系统-MyExamTest----codemirror(35)

笙默考试管理系统-MyExamTest----codemirror&#xff08;35&#xff09; 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试…...

MMKV(2)

API 初始化和实例获取&#xff1a; MMKV.initialize(Context context): 初始化MMKV库。通常在应用程序的入口点调用此方法。 MMKV.defaultMMKV(): 获取默认的MMKV实例。默认实例使用默认的存储路径和加密方式。 MMKV.mmkvWithID(String mmapID): 根据给定的ID获取MMKV实例。…...

Spring Boot项目中使用 TrueLicense 生成和验证License(附源码)

1、Linux 在客户linux上新建layman目录&#xff0c;导入license.sh文件&#xff0c; [rootlocalhost layman]# mkdir -p /laymanlicense.sh文件内容&#xff1a; #!/bin/bash # 1.获取要监控的本地服务器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {p…...

ES6 Iterator 和 for...of 循环

1.iterator 概念 ES6 添加了Map和Set。这样就有了四种数据集合&#xff0c;需要一种统一的接口机制来处理所有不同的数据结构。遍历器&#xff08;Iterator&#xff09;就是这样一种机制。它是一种接口&#xff0c;为各种不同的数据结构提供统一的访问机制。任何数据结构只要部…...

ubuntu20.04 nvidia显卡驱动掉了,变成开源驱动,在软件与更新里选择专有驱动,下载出错,调整ubuntu镜像源之后成功修复

驱动配置好&#xff0c;环境隔了一段时间&#xff0c;打开Ubuntu发现装好的驱动又掉了&#xff0c;软件与更新 那里&#xff0c;附加驱动&#xff0c;显示开源驱动&#xff0c;命令行输入 nvidia-smi 命令查找不到驱动。 点击上面的 nvidia-driver-470&#xff08;专有&#x…...

华为FAT模式无线AP配置实例

硬件&#xff1a;AP3010DN 软件版本&#xff1a;VRP software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) [Huawei]dis ver Huawei Versatile Routing Platform Software VRP (R) software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) Copyright (C) 2011…...

nodejs基于vue 学生论坛设计与实现

随着网络技术的不断成熟&#xff0c;带动了学生论坛&#xff0c;它彻底改变了过去传统的管理方式&#xff0c;不仅使服务管理难度变低了&#xff0c;还提升了管理的灵活性。 是本系统的开发平台 系统中管理员主要是为了安全有效地存储和管理各类信息&#xff0c; 这种个性化的平…...

017 基于Spring Boot的食堂管理系统

部分代码地址&#xff1a; https://github.com/XinChennn/xc017-stglxt 基于Spring Boot的食堂管理系统 项目介绍 本项目是基于Java的管理系统。采用前后端分离开发。前端基于bootstrap框架实现&#xff0c;后端使用Java语言开发&#xff0c;技术栈包括但不限于SpringBoot、…...

常用的二十种设计模式(下)-C++

设计模式 C中常用的设计模式有很多&#xff0c;设计模式是解决常见问题的经过验证的最佳实践。以下是一些常用的设计模式&#xff1a; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。工厂模式&#xff08;…...

C#桶排序算法

前言 桶排序是一种线性时间复杂度的排序算法&#xff0c;它将待排序的数据分到有限数量的桶中&#xff0c;每个桶再进行单独排序&#xff0c;最后将所有桶中的数据按顺序依次取出&#xff0c;即可得到排序结果。 实现原理 首先根据待排序数据&#xff0c;确定需要的桶的数量。…...

快速了解服务器单CPU与双CPU

​  在当今快节奏的技术环境中&#xff0c;用户们对功能强大且高效的服务器配置需求不断增长。CPU作为构成任何计算基础设施的骨干&#xff0c;服务器的“大脑”&#xff0c;负责执行计算、控制数据流并协调各个组件之间的任务&#xff0c;是服务器选择硬件中的重要一环。因此…...

c# Dictionary、ConcurrentDictionary的使用

Dictionary Dictionary 用于存储键-值对的集合。如果需要高效地存储键-值对并快速查找&#xff0c;请使用 Dictionary。 注意&#xff0c;键必须是唯一的&#xff0c;值可以重复。 using System; using System.Collections.Generic; using System.Linq;class Program {stati…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...