YARN (Yet Another Resource Negotiator) 是从 hadoop-0.23 开始引入的新架构,他的基本设计思想是将 JobTracker 的两个主要功能,资源管理和作业控制(包括调度/监视等),拆分为单独的守护进程,分别是一个全局的 ResourceManager(RM)和每个应用程序的 ApplicationMaster(AM)。应用程序可以是单个作业,也可以是作业的DAG。

0x00 YARN 架构

YARN 的全称是 Yet Another Resource Negotiator,YARN 整体上是 Master/Slave 结构,在整个框架中,ResourceManager 为 Master,NodeManager 为 Slave,如下图所示:

YARN架构

主要由以下几个组件构成:

  • ResourceManager (RM) : Scheduler, Applications Manager (ASM)
  • NodeManager (NM)
  • ApplicationMaster (AM)
  • Container

需要说明的是:Scheduler 是一个可插拔的组件,用户可根据自己的需求设计新的调度器,YARN 提供了多种直接可用的调度器,比如 FIFO Scheduler,Fair Scheduler 和 Capacity Schedule 等。

0x01 YARN 工作流程

如下图所示用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:

  • 启动AM ,如下步骤1~3;
  • 由AM创建应用程序为它申请资源并监控它的整个运行过程,直到运行完成,如下步骤4~7。

YARN工作流程

  1. 用户向YARN中提交应用程序,其中包括AM程序、启动AM的命令、命令参数、用户程序等;事实上,需要准确描述运行ApplicationMaster的unix进程的所有信息。提交工作通常由YarnClient来完成。

  2. RM为该应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动AM;

  3. AM首先向RM注册,这样用户可以直接通过RM査看应用程序的运行状态,运行状态通过 AMRMClientAsync.CallbackHandler的getProgress() 方法来传递给RM。 然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4〜7;

  4. AM采用轮询的方式通过RPC协议向RM申请和领取资源;资源的协调通过 AMRMClientAsync异步完成,相应的处理方法封装在AMRMClientAsync.CallbackHandler中。

  5. —旦AM申请到资源后,便与对应的NM通信,要求它启动任务;通常需要指定一个ContainerLaunchContext,提供Container启动时需要的信息。

  6. NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;

  7. 各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;ApplicationMaster与NM的通信通过NMClientAsync object来完成,容器的所有事件通过NMClientAsync.CallbackHandler来处理。例如启动、状态更新、停止等。

  8. 应用程序运行完成后,AM向RM注销并关闭自己。

0x02 YARN 资源管理

当前 YARN 支持内存和CPU两种资源类型的管理和分配。主要是 scheduler 和 NodeManager 的配置选项设置,参数如下:

参数名 默认值
yarn.resourcemanager.scheduler.class org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
yarn.scheduler.minimum-allocation-mb 1024
yarn.scheduler.maximum-allocation-mb 8192
yarn.scheduler.minimum-allocation-vcores 1
yarn.scheduler.maximum-allocation-vcores 32
yarn.nodemanager.resource.memory-mb 8192
yarn.nodemanager.vmem-pmem-ratio 2.1
yarn.nodemanager.pmem-check-enabled true
yarn.nodemanager.vmem-check-enabled true
yarn.nodemanager.resource.cpu-vcores 8
yarn.nodemanager.resource.percentage-physical-cpu-limit 100

另外,YARN 使用了轻量级资源隔离机制Cgroups进行资源隔离以避免相互干扰,一旦Container使用的资源量超过事先定义的上限值,就将其杀死。

参考文献

YARN Architecture
YARN 架构学习总结
Yarn技术原理
理解Hadoop YARN架构
YARN架构设计详解