此笔记是我学习 B站 尚硅谷相关课程的学习笔记

image-20220823101148083

一、Yarn 资源调度器

Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源

相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序

1.1、Yarn 基础架构

YARN 主要由 ResourceManagerNodeManagerApplicationMasterContainer 等组件构成。

image-20220823101527661

RecourceManager相当于是整个资源管理器的老大。NodeManager相当于是一个节点的资源管理器的老大。ApplicationMaster相当于是控制一次任务的管理器老大。Contaier相当于是执行任务的环境。

1.2、Tarn 工作机制

image-20220823101922146

  1. MapReduce 程序提交到客户端所在的节点。
  2. YarnRunnerResourceManager 申请一个 Application
  3. ResourceManager 将该应用程序的资源路径返回给 YarnRunner
  4. 该程序将运行所需资源提交到 HDFS 上。
  5. 程序资源提交完毕后,申请运行 mrAppMaster
  6. ResourceManager 将用户的请求初始化成一个 Task。
  7. 其中一个 NodeManager 领取到 Task 任务。
  8. NodeManager 创建容器 Container,并产生 MRAppmaster
  9. ContainerHDFS 上拷贝资源到本地。
  10. MRAppmaster 向 RM 申请运行 MapTask 资源。
  11. RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个 NodeManager 分 别领取任务并创建容器。
  12. MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 MapTaskMapTask 对数据分区排序。
  13. MrAppMaster 等待所有 MapTask 运行完毕后,向 RM 申请容器,运行 ReduceTask
  14. ReduceTaskMapTask 获取相应分区的数据。
  15. 程序运行完毕后,MR 会向 RM 申请注销自己。

1.3、作业提交全过程

1.3.1、流程图

HDFS、Yarn、MapReduce三者关系:

image-20220823102459202

作业提交过程之Yarn:

image-20220823102606883

作业提交过程之 HDFS & MapReduce

image-20220823102621208

1.3.2、作业提交全过程详解

  1. 作业提交

    1. Client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。
    2. Client 向 RM 申请一个作业 id。
    3. RM 给 Client 返回该 job 资源的提交路径和作业 id。
    4. Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
    5. Client 提交完资源后,向 RM 申请运行 MrAppMaster
  2. 作业初始化

    1. 当 RM 收到 Client 的请求后,将该 job 添加到容量调度器中。
    2. 某一个空闲的 NM 领取到该 Job。
    3. 该 NM 创建 Container,并产生 MRAppmaster
    4. 下载 Client 提交的资源到本地。
  3. 任务分配

    1. MrAppMaster 向 RM 申请运行多个 MapTask 任务资源。
    2. RM 将运行 MapTask 任务分配给另外两个 NodeManager,另两个 NodeManager 分别领取任务并创建容器。
  4. 任务运行

    1. MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 MapTaskMapTask 对数据分区排序。
    2. MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask
    3. ReduceTaskMapTask 获取相应分区的数据。
    4. 程序运行完毕后,MR 会向 RM 申请注销自己。
  5. 进度和状态更新

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

  6. 作业完成

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

1.4、Yarn 调度器和调度算法

目前,Hadoop 作业调度器主要有三种:

  • 先进先出调度器(FIFO)
  • 容量(Capacity Scheduler)
  • 公平(Fair Scheduler)

Apache Hadoop3.3.3 默认的资源调度器是 容量(Capacity Scheduler)。

CDH 框架默认调度器是 公平(Fair Scheduler)

具体设置详见:yarn-default.xml文件

1
2
3
4
5
<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):单队列,根据提交作业的先后顺序,先来先服务。

image-20220823105454008

优点:简单易懂

缺点:不支持多队列,生产环境很少使用

1.4.2、容量调度器(Capacity Scheduler)

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

1.4.2.1、特点

image-20220823105611366

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

1.4.2.2、分配算法

image-20220823105815020

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

1.4.3、公平调度器(Fair Scheduler)

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

1.4.3.1、特点

image-20220823121255600

1.4.3.2、缺额

image-20220823121334003

1.4.3.3、队列资源分配方式

image-20220823121408417

1.4.3.4、资源分配算法

image-20220823121448907

1.4.3.5、队列资源分配方式

image-20220823121538568

image-20220823121701486

1.5、Yarn 常用命令

Yarn 状态的查询,除了可以在 hadoop103:8088 页面查看外,还可以通过命令操作。常 见的命令操作如下所示:

需求:执行 WordCount 案例,并用 Yarn 命令查看任务运行情况。