1.架构

Yarn资源调度器_资源管理器
• MRv2:On YARN
– YARN:解耦资源与计算
• ResourceManager
– 主,核心
– 集群节点资源管理
• NodeManager
– 与 RM 汇报资源
– 管理 Container 生命周期
– 计算框架中的角色都以 Container 表示
• Container:【节点 NM,CPU,MEM,I/O 大小,启动命令】
– 默认 NodeManager 启动线程监控 Container 大小,超出申请 资源额度,kill
– 支持 Linux 内核的 Cgroup

– MR :
• MR-ApplicationMaster-Container
– 作业为单位,避免单点故障,负载到不同的节点
– 创建 Task 需要和 RM 申请资源(Container)
• Task-Container
– Client:
• RM-Client:请求资源创建 AM
• AM-Client:与 AM 交互

YARN – YARN:Yet Another Resource Negotiator;
– Hadoop 2.0 新引入的资源管理系统,直接从 MRv1 演化而来的;
– 核心思想:将 MRv1 中 JobTracker 的资源管理和任务调度两个功能分开,分 别由 ResourceManager 和 ApplicationMaster 进程实现
– ResourceManager:负责整个集群的资源管理和调度
– ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控 和容错等
– YARN 的引入,使得多个计算可运行在一个集群中
– 每个 job 对应一个 ApplicationMaster
– 目前多个计算框架可以运行在 YARN 上,比如 MapReduce、Spark、Storm 等
MapReduce On YARN:MRv2
– 将 MapReduce 作业直接运行在 YARN 上,而不是由 JobTracker 和 TaskTracker 构建的 MRv1 系统中

– 基本功能模块
– YARN:负责资源管理和调度
– MRAppMaster:负责任务切分、任务调度、任务监控和容错等
– MapTask/ReduceTask:任务驱动引擎,与 MRv1 一致

– 每个 MapRduce 作业对应一个 MRAppMaster
– MRAppMaster 任务调度
– YARN 将资源分配给 MRAppMaster
– MRAppMaster 进一步将资源分配给内部的任务

– MRAppMaster 容错
– 失败后,由 YARN 重新启动
– 任务失败后,MRAppMaster 重新申请资源
Yarn资源调度器_mapreduce_02

2 MR 执行流程

Yarn资源调度器_架构_03
一.作业提交:

  1. 提交作业 job 后,job.waitForCompletion(true)调用 monitorAndPrintJob()方法每秒轮询 作业进度,如果发现自上次报告后有改变,便把进度报告给控制台。Job 的 submit()方法 创建一个内部的 JobSubmitter 实例,并调用其 submitJobInternal 方法(步骤 1)。作业 完成后,如果成功,就显示计数器;如果失败,这将导致作业失败的错误记录到控制台。JobSubmitter 所实现的作业提交过程如下所述:
  2. 向资 ResourceManager 源管理器请求一个新作业的 ID,用于 MapReduce 作业 ID。
  3. 作业客户端检查作业的输出说明,计算输入分片 splits 并将作业资源(包括作业 Jar 包、 配置文件和分片信息)复制到 HDFS
  4. 通过调用资源管理器上的 submitApplication()方法提交作业

二.作业初始化

  1. 资源管理器 ResourceManager 收到调用他的 submitApplication()消息后,便将请求传 递给调度器(scheduler)。调度器分配一个容器(Container),然后资源管理器在节点 管理器(NodeManager)的管理下载容器中启动应用程序的 master 进程(步骤 5a 和 5b)
  2. MapReduce 作业的 application master 是一个 Java 应用程序,它的主类是 MRAppMaster。 它对作业进行初始化:通过创建多个簿记对象以保持对作业进度的跟踪,因为它将接受 来自任务的进度和完成报告
  3. 接下来,它接受来自共享文件系统的在客户端计算的输入分片(步骤 7)。对每一个分 片创建一个 map 任务对象以及由 mapreduce. job.reduces 属性确定的具体数量的 reduce 任务对象

三.任务分配

  1. AppMaster 为该作业中的所有 map 任务和 reduce 任务向资源管理器请求容器。

四.任务执行

  1. 一旦资源管理器的调度器为任务分配了容器,AppMaster 就通过与节点管理器 NodeManager 通讯来启动容器(步骤 9a 和 9b)。
  2. 该任务由主类为 YarnChild 的 Java 应用程序执行。在它允许任务之前,首先将任务需要 的资源本地化,包括作业的配置、JAR 文件和所有来自分布式缓存的文件.
  3. 最后运行 map 任务或 reduce 任务。

五.进度和状态更新

  1. 在 YARN 下运行时,任务每 3 秒钟通过 umbilical 接口向 APPMaster 汇报进度和状态。 客户端每一秒钟(通过 mapreduce.client. Progressmonitor.pollinterval 设置)查询一次 AppMaster 以接收进度更新,通常 都会向用户显示。

六.作业完成

  1. 除了向 AppMaster 查询进度外,客户端每 5 秒还通过调用 Job 的 waitForCompletion() 来 检 测 作 业 是 否 完 成 。 查 询 的 间 隔 可 以 通 过 mapreduce.client.completion.pollinterval 属 性 进 行 设 置 。 作 业 完 成 后 , AppMaster 和任务容器清理器工作状态。