当前位置: 代码网 > it编程>游戏开发>ar > sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

2024年08月04日 ar 我要评论
hadoop,mapreduce,yarn,hdfs

目录

搭建hadoop

下载hadoop

java

下载bin

windows

改环境变量

将winutils.exe和hadoop.dll放到c:\windows\system32下,然后重启

修改配置

vim core-site.xml

vim hdfs-site.xml

hadoop-env.sh  

mapred-site.xml

yarn-site.xml

格式化命令

 启动集群

启动命令

​编辑

web管理页面

查看示例

hadoop

hadoop是什么

hadoop的优势

hadoop的组成

 三个组件协作关系

hadoop生态圈

hdfs

hdfs是什么

shell操作命令

创建目录

上传文件夹

上传模糊匹配的命令

查看文件

查看文件内容

 下载文件

删除

拷贝

hdfs架构图

hdfs 块(block)

namenode:

datanode:

client:

secondarynamenode:

checkpoint

hdfs持久化

namenode

fsimage

edits

生成fsimage和edits场景

安全模式

什么是安全模式

进入安全模式的三种情况

hdfs写原理

hdfs读原理

hdfs集群

心跳机制

hdfs优缺点

hdfs优点:

hdfs劣势:

mapreduce

什么是mapreduce

流程

架构图

示例

yarn

什么是yarn

架构图

yarn工作流程

yarn作业提交全过程

作业提交

作业初始化

任务分配

任务运行

进度和状态更新

作业完成

mr任务执行

yarn调度器

fifo调度器

容量调度器(capacity scheduler)

公平调度器(fair scheduler)

与容量调度器对比

公平调度器缺额

公平调度器策略

参考文章


hadoop官网

https://hadoop.apache.org/

搭建hadoop

下载hadoop

下载后的目录作用

java

需要安装java,并且保证路径没有空格

下载bin

windows要去 https://gitee.com/nkuhyx/winutils

下载bin,并且将bin的内容拷贝到hadoop的bin文件夹中

 

windows

最好别用windows搭,贼坑,我都搭建完了,运行mapreduce的词频统计,还是失败(应该是权限问题,找了很多资料也解决不了),基于hadoop的hive也会失败(跟词频统计失败相同的报错),有空搭建个docker的

改环境变量

新增 hadoop_home  hadoop路径  xxx\hadoop-3.4.0
path后面新增  ;%hadoop_home%\bin;%hadoop_home%\sbin;

看一下安装完成

将winutils.exe和hadoop.dll放到c:\windows\system32下,然后重启

f:\workspace\arch\hadoop\hadoop-3.4.0\share\hadoop\mapreduce>hadoop jar hadoop-m
apreduce-examples-3.4.0.jar pi 1 1

修改配置

vim core-site.xml
vim hdfs-site.xml
hadoop-env.sh  

我的配置 

hadoop-env.cmd

mapred-site.xml
yarn-site.xml

格式化命令

在hadoop\hadoop-3.4.0\bin中,运行命令

hdfs namenode -format

自动生成了这俩文件夹,注意,data文件夹不可以自己先创建好,要让程序自动创建

 启动集群

启动命令

在hadoop\hadoop-3.4.0\sbin文件夹中运行命令

jps看看状态

 全部启动

web管理页面

打开网页

http://localhost:9870/

yarn页面  

http://localhost:8088/

查看示例

 试验一下,使用hadoop自带的功能

在input的文件夹下,创建file1.txt文件,内容是

在shell中用命令把这个文件的内容做多次重复

 for i in {1..1000}; do cat file1.txt >>file2.txt; done

将input上传到hdfs中

看一下上传成功了没

hadoop

hadoop是什么

  • hadoop是一个由apache基金会所开发的分布式系统基础架构
  • 主要解决海量数据的存储和海量数据的分析计算问题
  • 通常hadoop是指一个更广泛的概念–hadoop生态圈

hadoop的优势

  1. 高可靠性:hadoop底层维护了多个数据副本,所以即使hadoop某个计算元素存储出现故障,也不会导致数据的丢失
  2. 高扩展性:在集群运行间动态增加服务器,可方便地扩展数以千计的节点
  3. 高效性:在mapreduce思想下,hadoop是并行工作的,以加快任务处理速度。
  4. 高容错性:能够自动将失败的任务重新分配

hadoop的组成

  • 在hadoop1.x时代,hadoop中的mapreduce同时处理业务逻辑运算和资源的调度,耦合性较大
  • 在hadoop2.x时代,增加了yarn。yarn只负责资源的调度,mapreduce只负责运算,降低了耦合度
  • hadoop3.x在组成上没有变化

 三个组件协作关系

hadoop生态圈

hdfs

hdfs是什么

hadoop distributed file system(简称 hdfs)是一个分布式文件系统,是 hadoop 的核心组件之一。它能够将大规模数据存储到多个服务器集群上,并提供数据访问服务。

shell操作命令

创建目录

创建一个目录

一次创建多个目录

上传文件夹

上传文件夹到根目录

上传模糊匹配的命令

查看文件

查看文件内容

 下载文件

删除

拷贝

创建空文件

hdfs架构图

1、namenode和datanode节点初始化完成后,采用rpc进行信息交换,采用的机制是心跳机制,即datanode节点定时向namenode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保namenode知道datanode的情况;

2、namenode会将子节点的相关元数据信息缓存在内存中,对于文件与block块的信息会通过fsimage和edits文件方式持久化在磁盘上,以确保namenode知道文件各个块的相关信息;

3、namenode负责存储fsimage和edits元数据信息,但fsimage和edits元数据文件需要定期进行合并,这时则由secondnamenode进程对fsimage和edits文件进行定期合并,合并好的文件再交给namenode存储。 

hdfs 也是按照 master 和 slave 的结构。分 namenode、 secondarynamenode、datanode 这几个角色。

hdfs 块(block)

块是 hdfs 中存储、读写数据的基本单位。客户端向 dn 读写数据的时候,是按块来读写的。

​ hdfs 的设计目标是寻址时间占传输时间的 1%,一般情况下,寻址时间为 10ms(?),那么传输时间就是 1000 ms 即 1s,现在大多数磁盘的读写速度是 100 mb/s,那么传输一个单位的数据就是 1s × 100 mb/s = 100 mb,而 100 接近 128(2的7次方),所以 hdfs 默认的块大小是 128 mb。

​ 当然,我也说是大多数磁盘的读写速度是 100 mb/s,而有些性能好的磁盘可以达到更高的速度,那么就可以把块设置的更大。

​ 块要结合到磁盘读写速度,既不能太大,也不能太小,否则都会违反 hdfs 的设计目标:

​ (1)太大会导致寻址时间变的特小,而传输时间变的特大。程序在处理这块数据时,会非常慢。

​ (2)太小会导致 nn 中存储的块信息太多,增加 nn 的寻址时间。

​ 综上:影响 hdfs 块大小的就是磁盘的读写速度。当然也不能让寻址时间过长,这就要求我们不能在 hdfs 中存储大量的小文件。

namenode:

​ (1)负责管理 hdfs 的名称空间,即存储元数据信息(文件名、大小、位置等)

​ (2)配置副本策略

​ (3)接收来自 dn 的心跳,并且可以给 dn 发送命令

​ (4)接收 dn 上报的块信息

​ (4)处理客户端请求

datanode:

​ (1)存储实际的数据块(注意,不是文件本身)

​ (2)执行数据块的读写操作

client:

​ (1)把文件分成块,上传到 hdfs

​ (2)与 nn 交互发出读写文件的请求,并获得文件的位置信息

​ (3)与 dn 交互,读写文件

secondarynamenode:

为了避免edits文件过大,以及缩短namenode启动时恢复元数据的时间,我们需要定期地将edits文件合并到fsimage文件,该合并过程叫做checkpoint。(注意:合并 fsimage 和 edits 十分占内存, 2nn 与 nn 不能放在同一台节点上,否则会降低 nn 的性能)

对于大型的hdfs集群,fsimage能达到几个gb大小,namenode通常需要处理非常多的事务,导致namenode的负担比较重,再让它来进行i/o密集型的文件合并操作就不太合适了,所以hdfs引入了secondarynamenode专门负责这件事。也就是说,secondarynamenode(简称snn)是辅助namenode进行checkpoint操作的角色

snn的checkpoint时机:

  • 默认情况下,snn每隔1小时进行一次checkpoint
  • 但如果还没到1小时,距离上一次checkpoint后事务累积已经超过了1百万,就会立刻触发一次checkpoint

​ (2)在紧急情况下,辅助恢复 nn

checkpoint

checkpoint过程如下:

  1. snn请求nn生成新的edits_inprogress文件,后续新的edits将写入该文件中,之前正在写的edits文件成为待合并状态。nn同时更新seen_txid文件的内容为最新的edit文件id。
  2. snn使用http get请求的方式将待合并的edits文件和fsimage文件从nn复制到snn本地。
  3. snn将fsimage文件加载到内存,并重放edits文件中的事务进行合并,保存为新的fsimage文件。
  4. snn使用http put请求的方式将合并后的fsimage复制回nn,保存为.ckpt临时文件。
  5. nn将.ckpt临时文件重命名为正式的fsimage文件名。

上面说的都是集群只有一个namenode的情况。如果hdfs namenode开启了ha的话,secondarynamenode会被替换成standby namenode,checkpoint过程会直接交给standby namenode来负责。active namenode会将edits文件同时写到本地与共享存储(比如qjm方案就是journalnode集群)上去,standby namenode从journalnode集群拉取edits文件,和从active namenode拉取的fsimage进行合并,并保持fsimage文件与active namenode的同步 

hdfs持久化

namenode

1、`第一次启动 namenode 格式化后,创建 fsimage 和 edits 文件。如果不是第一次启动,直接加载 edits 和 fsimage 文件到内存。

2、客户端对元数据进行增删改的请求。

3、namenode 记录操作日志,更新滚动日志。

4、namenode 在内存中对数据进行增删改查。

fsimage

fsimage文件是namenode中关于元数据的镜像,一般称为检查点,它是在namenode启动时对整个文件系统的快照。包含了整个 hdfs文件系统的所有目录和文件的信息,可以说fsimage就是整个hdfs的目录清单,通过对其进行分析,可以分析出hdfs上小文件的分布情况

edits

editlog 主要是在 namenode 已经启动情况下对 hdfs 进行的各种更新操作进行记录,hdfs 客户端执行所有的写操作都会被记录到 editlog 中

生成fsimage和edits场景

安全模式

什么是安全模式

hdfs 的安全模式,即 hdfs safe mode, 是 hdfs 文件系统的一种特殊状态,在该状态下,hdfs 文件系统只接受读数据请求,而不接受删除、修改等变更请求,当然也不能对底层的 block 进行副本复制等操作。

从本质上将,安全模式 是 hdfs 的一种特殊状态,而 hdfs 进入该特殊状态的目的,是为了确保整个文件系统的数据一致性/不丢失数据,从而限制用户只能读取数据而不能改动数据的。

进入安全模式的三种情况

  • hdfs 集群正常冷启动

  在 hdfs 集群正常冷启动时, namenode 会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可。

  • block 丢失率达到 0.1%

如果 namenode 发现集群中的 block 丢失率达到一定比例时(0.1%), namenode 就会进入安全模式,换句话说,文件系统的块有99.9%以上是可用的,系统才能正常使用,不进入安全模式。这个丢失率是可以手动配置的

  • 手动进入安全模式

hdfs写原理

1、hdfs客户端提交写操作到namenode上,namenode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,如果有,然后进行查看,看哪几个datanode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的datanode节点下;

2、客户端拿到数据存放节点位置信息后,会和对应的datanode节点进行直接交互,进行数据写入,由于数据块具有副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完了,才算数据成功写入到hdfs上,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;

3、随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给namenode,告诉namenode文件已成功写入到对应的datanode。

写期间出现故障的处理

如果在数据写入期间datanode发生故障,则执行以下操作(对写入的数据的客户端是透明的)。首先关闭管道,然后将确认队列(ack queue)中的数据包都添加回数据队列(data queue)的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包。为存储在正常的datanode上的数据块指定一个新的标识,并将该标识传递给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。从管线(pipeline)中删除故障数据节点并把使用剩下的正常的datanode构建一个新的管线(pipeline)。余下的数据块写入新的管线中。namenode注意到块副本量不足时,会在另一个节点上创建一个新的复本,后续的数据块继续正常接受处理

hdfs读原理

1、hdfs客户端提交读操作到namenode上,namenode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的datanode节点下去读取数据块;

2、客户端拿到块位置信息后,会去和相关的datanode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给namenode返回状态信息,告诉namenode已经读取完毕。

3、客户端在读取指定datanode的块时,如果网络异常,无法读取,会读取这个块对应的备份datanode,在namenode返回的数据中包含了备份的datanode地址

4、客户端读取一个块成功后,读取下一个块的内容,追加在这个块之后

hdfs集群

心跳机制

心跳机制是指,每个datanode节点定期向namenode节点发送心跳信号,以表明该datanode节点仍然处于活动状态。这个心跳信号包括该datanode节点的状态信息,如已经存储的数据块信息,可用的存储容量等等。

namenode节点通过接收来自datanode节点的心跳信号,能够了解每个datanode节点的状态,以及数据块的位置和副本的数量等信息。如果某个datanode节点在一定时间内没有发送心跳信号,namenode节点会将该节点标记为不可用状态,并且将该节点上的数据块副本重新分配到其他可用的datanode节点上。

此外,hdfs的心跳机制还允许datanode节点向namenode节点汇报块的状态和副本的数量,以便namenode节点可以及时地监控和管理数据块的存储和复制。同时,namenode在收到datanode的心跳信号后,也会向datanode发送命令,如复制块、删除块等等。这些命令通常是为了维护数据块的完整性和可用性。

  • 心跳机制的时间频率:
    • 每三秒发送一次心跳信号
    • 超过630秒没有收到心跳信号,认为节点失效并且将该节点上的数据块副本重新分配到其他可用的datanode节点上
    • 所有的datanode每6个小时向namenode汇报一次自己完整的块信息,让namenode校验更新

hdfs优缺点

hdfs优点:

1、高容错性

  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。

  • 某一个副本丢失以后,它可以自动恢复,这是由 hdfs 内部机制实现的。

2、适合批处理

  • 它是通过移动计算而不是移动数据。

  • 它会把数据位置暴露给计算框架。

3、适合大数据处理

  • 处理数据达到 gb、tb、甚至pb级别的数据。

  • 能够处理百万规模以上的文件数量,数量相当之大。

  • 能够处理10k节点的规模。

4、流式文件访问

  • 一次写入,多次读取。文件一旦写入不能修改,只能追加。

  • 它能保证数据的一致性。

5、可构建在廉价机器上

  • 它通过多副本机制,提高可靠性。

  • 它提供了容错和恢复机制。比如某一个副本丢失,可以通过其它副本来恢复。

hdfs劣势:

1、不适合低延时数据访问

  • 比如毫秒级的来存储数据,它做不到。

  • 它适合高吞吐率的场景,就是在某一时间内写入大量的数据。

2、不适合小文件存储

  • 存储大量小文件(这里的小文件是指小于hdfs系统的block大小的文件(默认64m))的话,它会占用 namenode大量的内存来存储文件、目录和块信息。这样是不可取的,因为namenode的内存总是有限的。

  • 小文件存储的寻道时间会超过读取时间,它违反了hdfs的设计目标。

3、不适合并发写入、文件随机修改

  • 一个文件只能有一个写,不允许多个线程同时写。

  • 仅支持数据 append(追加),不支持文件的随机修改

mapreduce

什么是mapreduce

mapreduce 是一种用于处理大规模数据集的编程模型和计算框架,最初由 google 提出,并被 hadoop 等开源项目广泛应用。它主要包括两个阶段:map 阶段和 reduce 阶段

流程

1)map 阶段(map phase):

  • 输入数据被分割成大小相等的数据块,然后由多个 map 任务并行处理。
  • 每个 map 任务接收一部分数据块,并将其转换成键-值对(key-value pairs)的集合。
  • 用户定义的 map 函数(mapper)被应用于每个键-值对,生成新的键-值对列表。
  • map 函数的输出会根据键的哈希值被分发到多个 reduce 任务中,以便后续的 reduce 阶段处理。

2)shuffle 阶段(sort and shuffle):

  • 在 map 阶段之后,所有 map 任务的输出会被分区并按照键的哈希值进行排序。
  • 相同键的值被分配到相同的 reduce 任务中,以便后续的 reduce 阶段处理。

3)reduce 阶段(reduce phase):

  • 每个 reduce 任务接收来自多个 map 任务的输出,即经过分区和排序后的键-值对集合。
  • 用户定义的 reduce 函数(reducer)被应用于每个键-值对列表,生成最终的输出结果。

架构图

以上过程分步骤描述一下:

  1. 创建 split。由于 map 任务最终是分布式的进程运行在不同的机器上,split 描述了每个 map 任务该去哪台机器上的整块数据中,读取哪一部分的数据;
  2. 读取数据;
  3. 数据经过用户编写的 map 业务处理,输入的是 key-value 格式,输出也是 key-value 格式。这一步其实是对数据标记的过程,为每条数据标记一个特征(key),相同特征的数据最终会到一起;
  4. 数据经过分区后,写入到内存缓冲区中;
  5. 内存缓冲区被写满 80%后,在内存中进行排序(先按照分区排序,每个分区内部按照 key 排序);
  6. 如果定义了 combiner 的话,进行一次合并;
  7. 每个 map 溢写出一个文件出来;
  8. 最终对每个 map 溢写出的文件合并成一个大文件;
  9. 进行一次 combine,写入到本地文件中;
  10. 进行到 reduce 阶段,每个 reduce 任务从上游数据中拷贝出属于自己的文件
  11. 调用用户定义的 reduce 方法进行计算;
  12. 最终结果写入到 hdfs 中

 

示例

已文字计数为例

从mapreduce 自身的命名特点可以看出, mapreduce 由两个阶段组成:map 和reduce。

用户只需编写map() 和 reduce() 两个函数,即可完成简单的分布式程序的设计。

map() 函数以key/value 对作为输入,产生另外一系列 key/value 对作为中间输出写入本地磁盘。 mapreduce 框架会自动将这些中间数据按照 key 值进行聚集,且key 值相同(用户可设定聚集策略,默认情况下是对 key 值进行哈希取模)的数据被统一交给 reduce() 函数处理。

reduce() 函数以key 及对应的value 列表作为输入,经合并 key 相同的value 值后,产生另外一系列 key/value 对作为最终输出写入hdfs

hello world --wordcount 用户编写完mapreduce 程序后,按照一定的规则指定程序的输入和输出目录,并提交到hadoop 集群中。作业在hadoop 中的执行过程如图所示。hadoop 将输入数据切分成若干个输入分片(input split,后面简称split),并将每个split 交给一个map task 处理;map task 不断地从对应的split 中解析出一个个key/value,并调用map() 函数处理,处理完之后根据reduce task 个数将结果分成若干个分片(partition)写到本地磁盘;同时,每个reduce task 从每个map task 上读取属于自己的那个partition,然后使用基于排序的方法将key 相同的数据聚集在一起,调用reduce() 函数处理,并将结果输出到文件中 

yarn

什么是yarn

yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式 的操作系统平台,而 mapreduce 等运算程序则相当于运行于操作系统之上的应用程序。

架构图

yarn主要由resourcemanager、nodemanager、applicationmaster和container组成,之间通过rpc通讯

1、resourcemanager:是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(scheduler)和应用程序管理器(applications manager,asm)

2、nodemanager:是每个节点上的资源和任务管理器,一方面,它会定时地向resourcemanager汇报本节点上的资源使用情况和各个container的运行状态;另一方面,它接收并处理来自applicationmaster的container启动/停止等各种请求

3、container:是yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、cpu、磁盘、网络等,当am向rm申请资源时,resourcemanager为applicationmaster返回的资源便是用container表示

4、applicationmaster:用户提交的每个应用程序均包含一个applicationmaster,主要功能包括:

  1)与resourcemanager调度器协商以获取资源(用container表示)

  2)将得到的任务进一步分配给内部的任务

  3)与nodemanager通信以启动/停止任务

  4)监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务

注意:maptask、reducetask都运行在container里面,applicationmaster也运作在container里面,applicationmaster负责协调分发task到container

yarn工作流程

当用户向yarn中提交一个应用程序后,yarn将分两个阶段运行该应用程序:第一个阶段是启动applicationmaster;第二个阶段是由applicationmaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

如图2-11所示,yarn的工作流程分为以下几个步骤:

  1. 步骤1 用户向yarn中提交应用程序,其中包括applicationmaster程序、启动applicationmaster的命令、用户程序等
  2. 步骤2 resourcemanager为该应用程序分配第一个container,并与对应的nodemanager通信,要求它在这个container中启动应用程序的applicationmaster
  3. 步骤3 applicationmaster首先向resourcemanager注册,这样用户可以直接通过resourcemanage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7
  4. 步骤4 applicationmaster采用轮询的方式通过rpc协议向resourcemanager申请和领取资源
  5. 步骤5 一旦applicationmaster申请到资源后,便与对应的nodemanager通信,要求它启动任务
  6. 步骤6 nodemanager为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
  7. 步骤7 各个任务通过某个rpc协议向applicationmaster汇报自己的状态和进度,以让applicationmaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过rpc向applicationmaster查询应用程序的当前运行状态。
  8. 步骤8 应用程序运行完成后,applicationmaster向resourcemanager注销并关闭自己

yarn作业提交全过程

作业提交

第 1 步: client 调用 job.waitforcompletion 方法,向整个集群提交 mapreduce 作业。
第 2 步: client 向 rm 申请一个作业 id。
第 3 步: rm 给 client 返回该 job 资源的提交路径和作业 id。
第 4 步: client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
第 5 步: client 提交完资源后,向 rm 申请运行 mrappmaster。

作业初始化

第 6 步: 当 rm 收到 client 的请求后,将该 job 添加到容量调度器中
第 7 步: 某一个空闲的 nm 领取到该 job。
第 8 步: 该 nm 创建 container, 并产生 mrappmaster。
第 9 步:下载 client 提交的资源到本地。

任务分配

第 10 步: mrappmaster 向 rm 申请运行多个 maptask 任务资源。
第 11 步: rm 将运行 maptask 任务分配给另外两个 nodemanager, 另两个 nodemanager分别领取任务并创建容器。

任务运行

第 12 步: mr 向两个接收到任务的 nodemanager 发送程序启动脚本, 这两个nodemanager 分别启动 maptask, maptask 对数据分区排序。
第13步: mrappmaster等待所有maptask运行完毕后,向rm申请容器, 运行reducetask。
第 14 步: reducetask 向 maptask 获取相应分区的数据。
第 15 步: 程序运行完毕后, mr 会向 rm 申请注销自己。

进度和状态更新

yarn 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。

作业完成

除了向应用管理器请求作业进度外, 客户端每 5 秒都会通过调用 waitforcompletion()来检查作业是否完成。 时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。 作业完成之后, 应用管理器和 container 会清理工作状态。 作业的信息会被作业历史服务器存储以备之后用户核查。

mr任务执行

当applicationmaster在container启动之后,也就是mapreduce具体的运行过程,会通过inputformat阶段从hdfs拉取对应的数据分片,执行map、shuffle、reduce进行数据处理,最后通过outputformat将数据写到hdfs或其他存储引擎上。

yarn调度器

fifo调度器

单队列,根据提交作业的先后顺序,先来先服务。优点:简单易懂。缺点:不支持多队列,生产环境很少使用

容量调度器(capacity scheduler)

yarn默认调度器,特点如下:

  • 多队列: 每个队列可配置一定的资源量,每个队列采用fifo调度策略。
  • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
  • 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列
  • 多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定

公平调度器(fair scheduler)

与容量调度器对比

1)与容量调度器相同点

  • 多队列:支持多队列多作业
  • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上线
  • 灵活性: 如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
  • 多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

2)与容量调度器不同点

核心调度策略不同

  • 容量调度器:优先选择资源利用率低的队列
  • 公平调度器:优先选择对资源的缺额比例大的

每个队列可以单独设置资源分配方式

  • 容量调度器: fifo、 drf
  • 公平调度器: fifo、 drf、fair

公平调度器缺额

  • 公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫“缺额”
  • 调度器会优先为缺额大的作业分配资源

公平调度器策略

1) fifo策略

公平调度器每个队列资源分配策略如果选择fifo的话, 此时公平调度器相当于上面讲过的容量调度器

2) fair策略

fair 策略(默认) 是一种基于最大最小公平算法实现的资源多路复用方式, 默认情况下, 每个队列内部采用该方式分配资源。 这意味着, 如果一个队列中有两个应用程序同时运行, 则每个应用程序可得到1/2的资源;如果三个应用程序同时运行, 则每个应用程序可得到1/3的资源

具体资源分配流程和容量调度器一致;

(1) 选择队列

(2) 选择作业

(3) 选择容器

以上三步, 每一步都是按照公平策略分配资源

➢ 实际最小资源份额: mindshare = min(资源需求量, 配置的最小资源)

➢ 是否饥饿: isneedy = 资源使用量 < mindshare(实际最小资源份额)

➢ 资源分配比: minshareratio = 资源使用量 / max(mindshare, 1)

➢ 资源使用权重比: usetoweightratio = 资源使用量 / 权重

3) drf策略

drf(dominant resource fairness)我们之前说的资源, 都是单一标准, 例如只考虑内存(也是yarn默认的情况)。但是很多时候我们资源有很多种, 例如内存、cpu、网络带宽等,这样我们很难衡量两个应用应该分配的资源比例。

那么在yarn中, 我们用drf来决定如何调度:

假设集群一共有100 cpu和10t 内存,而应用a需要(2 cpu, 300gb),应用b需要(6 cpu, 100gb)。则两个应用分别需要a(2%cpu, 3%内存)和b(6%cpu, 1%内存)的资源, 这就意味着a是内存主导的, b是cpu主导的,针对这种情况,我们可以选择drf策略对不同应用进行不同资源(cpu和内存)的一个不同比例的限制。

参考文章

hadoop 核心原理(贼全面)_hadoop原理-csdn博客

hadoop(二:hadoop3.3.0搭建,hdfs shell 命令,mapreduce程序)_hadoop 3.3.0-csdn博客

【好程序员】大数据开发技术hadoop视频教程,hadoop3.x从入门安装环境搭建到项目实战_哔哩哔哩_bilibili

 windows下安装hadoop(手把手包成功安装)_windows安装hadoop-csdn博客

hdfs原理(超详解)-csdn博客

3 hdfs_hdfs命令计算hdfs读取时间-csdn博客

https://zhuanlan.zhihu.com/p/61646300

hadoop原理之——hdfs原理-csdn博客

hdfs小文件使用fsimage分析实例_hdfs fsimage-csdn博客

【hadoop-hdfs】hdfs中fsimage与edits详解_hdfs fsimage-csdn博客

hdfs 安全模式-csdn博客

hdfs心跳机制_hdfs heartbeat packet-csdn博客

https://zhuanlan.zhihu.com/p/374691395

hadoop学习笔记-yarn原理_公平调度器每个队列资源分配策略如果选择fifo的话,此时公平调度器相当于上面讲过-csdn博客

https://www.cnblogs.com/wwzyy/p/17078564.html

mapreduce原理简介_2.mapreduce编程的原理是什么?-csdn博客

hadoop系统架构与简单介绍-腾讯云开发者社区-腾讯云

https://zhuanlan.zhihu.com/p/46242749

https://zhuanlan.zhihu.com/p/674039703

mapreduce的原理分析_根据下图分析mapreduce的设计架构及实现机制。-csdn博客

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com