Yarn 资源调度器

1 Yarn资源调度器

问题:
1.如何管理集群资源?
2.如何给任务合理分配资源?

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

1.1 Yarn基础架构

ResourceManager(RM)主要作用,创建分配的作用:
1.处理客户端请求
2.监控NodeManager
3.启动或监控ApplicationMaster
4.资源的分配与调度

NodeManager(NM)主要作用,处理作用:
1.管理单个节点上的资源
2.处理来自ResourceManager的命令
3.处理来自ApplicationMaster的命令

ApplicationMaster(AM)的主要作用:
1.为应用程序申请资源并分配给内部的任务
2.任务的监控与容错(监控MapTask与ReduceTask)

Container的主要作用:
Container是YARN中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等资源。

image

1.2 Yarn工作机制(常见面试题)

image

说明
0.程序提交到客户端所在的节点。
1.YarnRunner 向 ResourceManager 申请一个 Application。
2.RM 将该应用程序的资源路径返回给 YarnRunner。
3.客户端提交job运行需要的资源到HDFS上
Job.split 控制开启MapTask的个数
Job.xml 控制该任务运行的参数
wc.jar 程序代码
4.程序资源提交完毕后,申请运行 mrAppMaster。
5.RM 将用户的请求初始化成一个 Task。ResouceManager里的任务会被放到任务队列里,一个一个进行处理
8.ApplicationMaster根据提交的Job去集群资源上(hdfs://.../staging/application_id)下载job资源到本地
9.ApplicationMaster根据提交的Job.split数量申请MapTask的数量,这里假设是2个MapTask,这两个MapTask可能在不同的NodeManager也可能在一个NodeManager
11.发送程序启动脚本之后,会开启两个YarnChild进程
12.ApplicationMaster监控MapTask完成任务后,申请运行ReduceTask,这里假设有两个分区,开启两个ReduceTask。先开启container容器,在容器中启动ReduceTask,ReduceTask对应的进程是YarnChild。

1.3 作业提交过程

image

Yarn和MapReduce之间的工作流程

image

HDFS和MapReduce之间的工作流程

image

作业提交全过程详解

  1. 作业提交
    第 1 步: Client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。
    第 2 步: Client 向 RM 申请一个作业 id。
    第 3 步: RM 给 Client 返回该 job 资源的提交路径和作业 id。
    第 4 步: Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
    第 5 步: Client 提交完资源后,向 RM 申请运行 MrAppMaster。
  2. 作业初始化
    第 6 步: 当 RM 收到 Client 的请求后,将该 job 添加到容量调度器中。
    第 7 步: 某一个空闲的 NM 领取到该 Job。
    第 8 步: 该 NM 创建 Container, 并产生 MRAppmaster。
    第 9 步: MRAppmaster下载 Client 提交的资源到本地。
  3. 任务分配
    第 10 步: MrAppMaster 向 RM 申请运行多个 MapTask 任务资源。
    第 11 步: RM 将运行 MapTask 任务分配给另外两个 NodeManager, 另两个 NodeManager分别领取任务并创建容器。
  4. 任务运行
    第 12 步: MR 向两个接收到任务的 NodeManager 发送程序启动脚本, 这两个
    NodeManager 分别启动 MapTask, MapTask 对数据分区排序。
    第13步: MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
    第 14 步: ReduceTask 向 MapTask 获取相应分区的数据。
    第 15 步: 程序运行完毕后, MR 会向 RM 申请注销自己。
  5. 进度和状态更新
    YARN中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。
  6. 作业完成
    除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。 时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。 作业完成之后, 应用管理器和 Container会清理工作状态。 作业的信息会被作业历史服务器存储以备之后用户核查。

1.4 Yarn调度器和调度算法

调度器管理哪一个任务先执行,每一个任务分配多少资源,有几个并发任务可以同时进行。

Hadoop作业调度器主要有三种

  • FIFO
  • Capacity Scheduler 容量 ★Apache Hadoop3.1 默认
  • Fair Scheduleer 公平

具体设置:yarn-defaoult.xml

<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

1.4.1 先进先出调度器(FIFO)

FIFO(First In First Out):单队列,根据提交作业的先后顺序,先到先服务。效率太低。

1.4.2 容量调度器(Capacity Scheduler)

Capacity Scheduler是Yahoo开发的多用户调度器

容量调度器特点

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

容量调度器资源分配算法

队列资源分配:优先选择资源占用率最低的队列分配资源(如占20%资源的队列先开始)
作用资源分配:默认按照提交作业的优先级提交时间顺序分配资源。
容器资源分配:按照容器的优先级分配资源,如果优先级相同,按照数据本地性原则
1.任务和数据在同一个节点
2.任务和数据在同一个机架
3.任务和数据不在同一个节点也不在同一个机架

1.4.3 公平调度器(Fair Scheduler)

Fair Scheduler是Facebook开发的多用户调度器

公平调度器特点

与容量调度器相同点
1.多队列:支持对多队列多作业
2.容量保证:资源不够的时候,让每个队列都享有资源的使用
2.灵活性
4.多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一用户的作业独占队列中的资源,该调度器会对**同一用户提交的作业所占资源进行限定

与容量调度器不同点

调度器 核心调度策略不同 每个队列可以单独设置资源分配方式
容量调度器 优先资源利用率低的队列 FIFO、DRF(内存+CPU)
公平调度器 优先选择对资源的缺额比例大的 FIFP、FAIR、DRF

任务处理顺序

缺额
已有四个任务,新增job15

理想:5个任务公平分配资源
实际:需要从其他四个任务中分出资源分配给job5

缺额:某一个时刻一个作业应获资源和实际获取资源的差距
公平调度器会优先为缺额大的作业分配资源

公平调度器队列资源分配方式

image

案例

image

1.队列资源分配
假设集群总资源100 --> 100/3 = 33.3
三个队列对资源的需求分别是
A:20
B:50
C:30

第一次平均分配
A:33.33 -> 多分配了13.33
B:33.33 -> 少分配了16.67
C:33.33 -> 多分配了3.33
第二次把多分的部分加起来给少的队列分配 (13.33+3.33)/1=16.66
A:分配20
B:分33.33+16.66 = 50
C:分30

2.作业资源分配
image

3.DRF(Dominant Resource Fairness)策略
之前都是单一标准,比如只考虑内存(默认情况)

那么在YARN中,我们用DRF来决定如何调度:
假设集群一共有100CPU和10T内存,而应用A需要(2CPU,300GB),应用B需要(6CPU,100GB)。
则两个应用分别需要A(2%CPU,3%内存)和B(6%CPU,1%内存)的资源,这就意味着A是内存主导的,B是CPU主导的,针对这种情况,我们可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。

posted @ 2021-10-27 21:16  rananie  阅读(224)  评论(0编辑  收藏  举报