MapReduce 机理

1.hadoop 平台进程

Namenode进程:

管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log),这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。

Namenode容错机制

第一种方式是将持久化存储在本地硬盘的文件系统元数据备份。Hadoop可以通过配置来让Namenode将他的持久化状态文件写到不同的文件系统中。这种写操作是同步并且是原子化的。比较常见的配置是在将持久化状态写到本地硬盘的同时,也写入到一个远程挂载的网络文件系统。

第二种方式是运行一个辅助的Namenode(Secondary Namenode)。 事实上Secondary Namenode并不能被用作Namenode它的主要作用是定期的将Namespace镜像与操作日志文件(edit log)合并,以防止操作日志文件(edit log)变得过大。通常,Secondary Namenode 运行在一个单独的物理机上,因为合并操作需要占用大量的CPU时间以及和Namenode相当的内存。辅助Namenode保存着合并后的Namespace镜像的一个备份,万一哪天Namenode宕机了,这个备份就可以用上了。

但是辅助Namenode总是落后于主Namenode,所以在Namenode宕机时,数据丢失是不可避免的。在这种情况下,一般的,要结合第一种方式中提到的远程挂载的网络文件系统(NFS)中的Namenode的元数据文件来使用,把NFS中的Namenode元数据文件,拷贝到辅助Namenode,并把辅助Namenode作为主Namenode来运行。

DATANODE

Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。

集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作。

Secondary  NameNode

Secondary  NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的 快照。由于NameNode是单点的,通过Secondary  NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary  NameNode可以及时地作为备用NameNode使用。

(1)       Secondary NameNode请求NameNode进行edit log的滚动(即创建一个新的edit log),将新的编辑操作记录到新生成的edit log文件;

(2)       通过http get方式,读取NameNode上的fsimage和edits文件,到Secondary NameNode上;

(3)       读取fsimage到内存中,即加载fsimage到内存,然后执行edits中所有操作(类似OracleDG,应用redo log),并生成一个新的fsimage文件,即这个检查点被创建;

(4)       通过http post方式,将新的fsimage文件传送到NameNode;

(5)       NameNode使用新的fsimage替换原来的fsimage文件,让(1)创建的edits替代原来的edits文件;并且更新fsimage文件的检查点时间。

ResourceManager(RM)
        ResourceManage 即资源管理,在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)。

资源分配单位用“资源容器”(Contrainer)表示,Container是一个动态资源分配单位,它将内存、cpu、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。

1)处理客户端请求;
2)启动或监控ApplicationMaster;  
3)监控NodeManager;  
4)资源的分配与调度。

NodeManager(NM)

NodeManager进程运行在集群中的节点上,每个节点都会有自己的NodeManager。Nodemanager整个集群有多个,负责每个节点上的资源和使用。NodeManager是一个slave服务:

它负责接收处理来自ResourceManager的资源分配请求,分配具体的Container给应用。  
同时,它还负责监控并报告Container使用信息给ResourceManager。NodeManager只负责管理自身的Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是ApplicationMaster
NodeManager的任务包括:

1)和ResourceManager保持同步
2)跟踪Node的状态
3)监控Container的生命周期,监控Container使用的资源
4)管理Distributed Cache
5)管理Container生成的日志

MapReduce机理

1.1 MapTask
工作机制简述: 输入的数据通过 split 被逻辑切分为多个 split 文件,通过 Record 按行读取内容给 map(用户实现)进行处理,数据被 map 处理结束后交给 OutputCollector 收集器,对其结果 key 进行分区(hash),然后写入 buffer,每个 maptask 都有一个内存缓冲区,存储着 map 的输出结果,当缓冲区快满时需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个 maptask 结束后,再对磁盘中 maptask 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待 reducetask 获取该数据。

1.2 ReduceTask
工作机制简述: Reduce 分为 copy、sort、reduce 三个阶段。ReduceTask 从各个 MapTask 上远程 copy 一片数据,进行一次归并排序,最后由 reduce(用户实现)将数据写到 HDFS 上。

>>>>>2. 数据输入
数据输入:输入文件的格式包括:日志文件、二进制文件、数据库表等,具体的文件类型,就需要对应的 InputFormat 来读取数据。

常用的 InputFormat 的实现类:

FileInputFormat: 按照文件的内容长度进行切片,切片大小默认等于 Block 大小,切片时不需要考虑数据集整体,只是针对每一个文件单独切片。
TextInputFormat: 是 FileInputFormat 默认的实现类,按照行读取每行记录,键是存储改行在整个文件中的起始字节偏移量(offset),LongWritable 类型;值是该行的内容,Text 类型。
CombineTextInputFormat: 用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,及将多个小文件交给一个 MapTask 处理。

数据块: 是 HDFS 存储的数据单位,实际上是 HDFS 将文件分成一块一块(Block)

数据切片: 是 MapReduce 程序计算输入数据的单位,一个切片会启动一个对应的 MapTask(数据切片只是逻辑上对输入的数据进行分片)

MapTask 原理

inputformat 阶段: inputFormat(默认 TextInputFormat)通过 getSplits 方法对输入目录中的文件进行逻辑切片,得到 block,但后分配对应数量的 MapTask。

read 阶段: MapTask 通过 inputFormat 获取 recordReader 对象(默认 LineRecordReader)进行读取,以 \n 最为分隔符,读取一行数据,返回 <key, value>。key 表示每行首字符的字节偏移量,value 表示这一行的内容

map 阶段: 将解析出的 <key, value> 交给用户自己继承的 Mapper 类中,执行其中的 map 方法。RecordReader 每读取一行,在这里调用一次!

 Collect 阶段: Mapper 的逻辑结束后,将每条数据通过 contect.write 进行收集数据,通过 OutputCollect.collect() 输出结果;在 collect() 方法中,会先对其进行分区(默认使用 HashPartitioner)处理,并写入一个环形缓冲区中

MapTask 提供的 Partitioner 接口,其作用是根据 key 或 value 及 reducer 的数量来决定当前输出数据应该交由 reducetask 处理,默认对 key hash 后以 reducer 数量取模(默认的取模方式是平均 reducer 的处理能力)

缓冲区的作用是批量收集 Mapper 结果,减少磁盘 I/O 的影响,key/value 对以及 partition 的结果都会被写入缓冲区(key、value 都会被序列化成字节数组)。

Spill 阶段: 当溢写线程启动后,对着缓冲区80%空间内的 key 做依次本地排序(sort),并在必要时对数据进行合并、压缩等操作

溢写的流程

1、利用快速排序算法对缓冲区内的数据进行排序,先按照分区编号排序,然后每个分区内按照key排序。

2、按照分区编号将每个分区中的数据写入任务工作目录下的临时文件 output/spillN.out(N表示当前溢写的次数)。如果有 Combiner ,则写入文件之前,对每个分区内的数据进行依次聚集操作。

3、将分区数据的元数据写到内存索引数据结构 SpillRecord 中。如果当前内存索引大小超过1MB,则将内存索引写到文件 output/spillN.out.index 中。

Merge 阶段: 每次溢写会在磁盘上生成一个临时文件(写之前判断是否需有 Combiner),当数据处理结束后,会对所有的临时文件进行一次合并,确保最终只生成一个文件(output/file.out),同时生成一个索引文件(output/file.out.index)以记录数据偏移量。

环形缓冲区

环形缓冲区是一个数组,数组中存放着 key、value 的序列化数据以及相关的元数据,包括 partition、key的起始位置、value的起始位置、value的长度等。

缓冲区的默认大小是100MB,当缓冲区80%的空间被占用是,就会启动溢写(Spill),Mapper 的输出结果可以往剩下20%的空间继续写入数据。

 MapTask 并行度决定依据

一个 Job 的 Map 阶段并行度由 Job 的分片数决定。每一个 Split 分片分配一个 MapTask 进行处理。

Shuffle

Shuffle: map 阶段完成后,数据需要传输到 reduce,这中间的(数据处理)过程可称为 shuffle(洗牌,发牌)。

shuffle的核心机制包括:数据分区、排序、分组、规约、合并等过程。

input Split: 输入的数据分片后,每一个 split 都会由一个 Mapreduce 处理,最先由 map 进行处理

 Map 阶段的 Shuffle:

Collect 阶段: 将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value序列化数据,Partition分区信息等。

Spill 阶段: 当内存中的数据量达到一定的阀值(80%)的时候,就会将数据写入本地磁盘。在将数据写入磁盘之前,线程首先根据数据最终要传递到的 Reduce 任务把数据划分成相应的分区(Partition),每个分区中对数据的 key 进行一次排序的操作,如果配置了combiner(预聚合),还会将有相同分区号和 key 的数据进行聚合。

 Merge 阶段: 把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。

溢出写文件归并完毕后,Map 任务将删除所有的临时溢出写文件,并告知 TaskTracker 任务已完成,只要其中一个 Map 任务完成,Reduce 任务就会开始复制它的输出(Copy 阶段)。

Map 任务的输出文件放置在运行 Map 任务的 TaskTracker 的本地磁盘上,它是运行 Reduce 任务的 TaskTracker 所需要的输入数据。

 Reduce 阶段的 Shuffle:

Copy 阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上,根据自己的分区号,复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。

 Merge 阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程(一个是内存到磁盘的合并,一个是磁盘到磁盘的合并),对本地的数据文件进行合并操作。

merge 有三种形式:

内存到内存:该形式不启用

内存到磁盘:该形式一直在运行

磁盘到磁盘:marge阶段,生成最终的文件

Sort 阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask 阶段已经对数据进行了局部的排序,ReduceTask只需对Copy的数据进行归并排序。

最终文件默认位于磁盘中,当 Reduce 的输出文件已定,整个 Shuffle 阶段就结束了,但后进行 Reducer 的执行(从文件中取出每一个键值对,调用用户自定义的 reduce 方法)。

Partition 分区

当数据文件过大时,我们可以按照不同的条件将大文件拆分为小分进行处理,比如按照区域划分、按照日期划分等。

分区: MapReduce 在 Map 阶段结束后,会对数据按照 key 进行分区。

默认分区数据量为1,如果job中设置了 reduceTask 数量,则分区数量与 reduceTask 数量一致。

Partitioner

在 Driver 中,我们可以通过 job.setNumReduceTasks(Num) 来自定义分区数量,在理解之前就先试下。

对原本输出一个文件的案例的 Driver 修改其 ReduceTasks 数量:

分区数量

分区数 = reduce数:理想状态

分区数 > reduce数:任务报错

分区数 < reduce数:生成多余空文件

 Comparable 排序

MapTask 和 ReduceTask 均会对数据按照 key 的字典顺序进行(快速)排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。

Task的排序
对于 MapTask ,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。

对于 ReduceTask ,它从每个 MapTask 上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask 统一对内存和磁盘上的所有数据进行一次归并排序。

排序分类
部分排序: MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部有序。

全局排序: 最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。

辅助排序: (GroupingComparator分组) ,在Reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。

⼆次排序: 如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class) 可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。

 Combiner 预聚合

Combiner: 是 MapReduce 提供的一个 Mapper 端的预聚合机制,是对每个 Mapper 产生的结果进行本地聚集。

ReduceTask 原理

ReduceTask 并行度决定机制

ReduceTask 的并行度将影响 Job 执行的并发度和,执行效率。

ReduceTask 数量的设置:

job.setNumReduceTasks(X);
ReduceTask 的数量默认为1,对应最终输出文件的数量。如果数据分布不均匀,就有可能在Reduce阶段产生数据倾斜。

数据输出

数据输出的父类为 OutputFormat。

常用的 OutputFormat 的实现类:

TextOutputFormat:默认的输出格式,它把每条记录写为文本行,且

key/value 可以是任意类型

SequenceFileOutputFormat:将输出写为一个顺序文件,格式紧凑易于压缩,如果输出需要为后续 MapReduce 任务的输入,这便是一种很好的输出格式。

自定义输出:符合特定需求,比如输出数据到MySQL、HBase等存储框架中。

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

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

相关文章

mp3转m4a怎么转?4种方法无损转换音频~

M4A文件格式&#xff0c;或称MPEG-4 Audio&#xff0c;崭露头角于音频时代。其诞生旨在提供更高保真度和更高效的音频压缩&#xff0c;为多媒体应用和苹果设备赋能。 M4A格式与MP3格式的优缺点对比 M4A与MP4格式密不可分&#xff0c;均属于MPEG-4标准。相较MP3&#xff0c;M4A…

C++入门之类和对象

C入门之类和对象 文章目录 C入门之类和对象1. 类的6个默认对象2. 构造函数2.1 概念2.2 特性2.3 补丁 3. 析构函数3.1 概念3.2 特性3.3 总结 4. 拷贝构造函数4.1 概念4.2 特性4.3 总结 1. 类的6个默认对象 如果一个类中什么都没有&#xff0c;那么这个类就是一个空类。但是&…

ubuntu23.10.1 php8.2安装

1、更新镜像源 apt update2、安装php 如果在这里不知道自己Linux能安装什么版本的php,可以使用apt install php,会给你提示&#xff0c;根据提示自己选择版本安装 apt install php我这里是php8.2-cli apt install php8.2-cli其他扩展包&#xff0c;在后面加个-可以查看&…

4月16号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次&#xff0c;每一层负责特定的功能&#xff0c;从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI&#xff08;开放系统互联&#xff09;模型和TCP/IP模型。 特点和作用&#xff1a; 分…

潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏

游戏名称&#xff1a;潮玩宇宙大逃杀 游戏类型&#xff1a;休闲竞技类小游戏 游戏目标&#xff1a;玩家通过选择房间躲避杀手&#xff0c;生存下来并瓜分被杀房间的元宝。 核心功能 房间选择&#xff1a;玩家进入游戏后&#xff0c;可以选择一间房间躲避杀手。杀手行动&…

IP组播简介

定义 作为IP传输三种方式之一&#xff0c;IP组播通信指的是IP报文从一个源发出&#xff0c;被转发到一组特定的接收者。相较于传统的单播和广播&#xff0c;IP组播可以有效地节约网络带宽、降低网络负载&#xff0c;避免广播堵塞带来的诸如摄像头花屏&#xff0c;视频马赛克等…

【Index to Lectures or Courses】

文章目录 1 Speech / Course2 Material3 Basic knowledge and tools4 职位缩写你知道几个? 1 Speech / Course 《中国文化文概论》&#xff08;武汉大学&#xff09;【Paper material】【阅读笔记】【Reading Notes】&#xff08;1&#xff09;【Reading Notes】&#xff08;…

PotPlayer 图像截取

PotPlayer 图像截取 1. PotPlayer2. PotPlayer 下载2.1. PotPlayer 240305 3. 图像截取References 1. PotPlayer http://www.potplayercn.com/ PotPlayer 是 KMPlayer 原作者姜勇囍进入新公司 Daum 之后推出的&#xff0c;继承了 KMPlayer 所有的优点&#xff0c;拥有异常强大…

一、 蓝牙的发展史

一、 蓝牙的发展史 遇见蓝牙 第一次遇见蓝牙是2006年&#xff0c;室友拿着一款摩托罗拉的翻盖手机向我炫耀它的蓝牙功能&#xff0c;那时候我不记得有没有蓝牙耳机问世&#xff0c;因为当时我嫉妒的一再追问他&#xff0c;有这蓝牙有什么用&#xff1f; 他给我说用来传输照片…

机器学习-11-基于多模态特征融合的图像文本检索

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…

【编程Tool】DevC++的安装配置及使用保姆级教程

目录 前言&#xff1a;软件介绍 1.软件下载及安装 1.1. 双击可执行文件进行安装 2.软件配置 2.1.选择语言 2.2 同意相关协议 2.3.组件保持默认并点击Next 2.4. 修改安装路径 2.5. 等待安装 2.6. 点击Finish&#xff0c;完成安装 2.7 选择语言 2.8.个性化设置 2.9. 点击OK&…

C++奇迹之旅:隐含的this指针

文章目录 &#x1f4dd;this指针&#x1f320; this指针的引出&#x1f309; this指针的特性&#x1f309;this指针存在哪里 &#x1f320;思考&#x1f320;C语言和C实现Stack的对比&#x1f309; C语言实现&#x1f309; C实现 &#x1f6a9;总结 &#x1f4dd;this指针 在C…

Vue(二)

文章目录 1.条件渲染1.关于js中的false的判定2.基本介绍3.v-if1.需求分析2.代码实例 4.v-show实现5.v-if与v-show比较6.课后练习 2.列表渲染1.代码实例2.课后练习 3.组件化编程1.基本介绍2.实现方式一_普通方式2.实现方式二_全局组件方式3.实现方式三_局部组件方式 4.生命周期和…

拥抱企业消费新纪元,胜意科技2024代理人大会圆满落幕

因信赖相聚&#xff0c;为共赢而来。近日&#xff0c;由胜意科技主办的“做好生意&#xff0c;拥抱胜意——2024代理人大会”在武汉成功召开&#xff0c;吸引了全国各地百余家TMC生态合作伙伴齐聚一堂&#xff0c;共同探讨数字化浪潮下的差旅管理实践&#xff0c;激发增长新智慧…

十大排序——9.桶排序

这篇文章我们来介绍一下桶排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 桶排序和计数排序一样&#xff0c;都不是基于比较进行排序的。 下面通过一个例子来理解一下桶排序吧。 首先&#xff0c;给你一个无序数组[ 20,18,28,66,25,31,67,30 ]&#xff0c;然后&#…

【GD32】_时钟架构及系统时钟频率配置

文章目录 一、有关时钟源二、系统时钟架构三、时钟树分析四、修改参数步骤1、设置外部晶振2、选择外部时钟源。3、 设置系统主频率大小4、修改PLL分频倍频系数 学习系统时钟架构和时钟树&#xff0c;验证及学习笔记如下&#xff0c;如有错误&#xff0c;欢迎指正。主要记录了总…

【电控笔记2.2】电流回路+延迟效应

延迟效应的来源以及影响 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 滤波器的传递函数与性能参数

C语言入门第四天(数组)

一、C语言数组的基本语法 1.数组的定义 数组是 C 语言中的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据。数组中的每个元素可以通过一个索引&#xff08;下标&#xff09;来访问&#xff0c;索引从 0 开始&#xff0c;最大值为数组长度减 1。 2.定义语法格式 …

Linux进阶篇:文件传输工具curl命令详解

文件传输工具Linux curl命令详解 一 curl命令介绍 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具&#xff0c;可以说是一款很强大的http命令行工具。它支持文件的上传和下载&#xff0c;是综合传输工具&#xff0c;但按传统&#xff0c;习惯称url为下载工具。…

leetcode-反转链表

206. 反转链表 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3…