简介
[TOC]
Yarn 最基本的想法是将资源管理的功能与job调度与监控的功能分放在不同的领域。 以此为基础, 就产生了全局的ResourceManager(RM)和针对每个应用的ApplicationMaster(AM)。这里的应用包括单独的job或者多个job的有向无环图。 ResourceManager 和 NadeManager 构成了数据计算框架。 ResourcerManager 拥有决定系统中所有应用享有资源的最终权利。 NodeManager是每天机器的客户端框架, 它的职责是管理containers, 监控资源的使用情况(cpu, memory, disk, network)以及将这些状态上报给ResourceManager/Scheduler上。
每个应用都会有一个ApplicationMaster, 它的任务时向ResourceManager申请资源, 与NodeManager一同执行任务并对其监控。
ResourceManager有俩大部分: Scheduler和ApplicationManager
Scheduler的职责是为各种运行的应用分配资源, 使其满足大致相同的容量,队列等。 Scheduler是一个单纯的调度器,它并不包含对应用的监控和状态的跟踪, 同样,它也不负责由于应用错误或者硬件错误等造成的失败任务的重启。 Scheduler只负责应用资源的申请, 这种资源被抽象为Container(包含memory,cpu,disk, network等)
Scheduler包含一个附加的策略,主要负责对不同的queue,application中的资源进行分区。 目前example中使用的策略有 CapacityScheduler 和 FairScheduler
ApplicationsManager职责包括接收job的提交, 判断执行应用的ApplicationMaster的第一个container, 以及重启失败的ApplicationMaster。
每一个ApplicationMaster的职责是从Scheduler中申请合适的资源container, 跟踪他们的状态以及监控他们的进程。
在hadoop2.x 的MapReduce 与之前版本维持了API compatibility 规则,也就意味了,之前的mrjob 不需要代码,只需要重新编译一下就可以在最新的yarn上运行
yarn依赖 ReservationSystem 支持了资源预定(resource reservation ), 这就允许用户事先指定所需要的资源数目, 为比较重要的job的执行预留资源。
ResourceManager
schedule 根据容量,队列等将系统中的资源分配给各个正在运行的应用
ApplicationManager 接收job的提交, 判断执行应用的ApplicationMaster的第一个container, 以及重启失败的ApplicationMaster
NodeManager
container 对资源的封装,包括memory, disk, cpu, network等
AppMaster Scheduler中申请合适的资源container, 跟踪他们的状态以及监控他们的进程, 同时向ResourceManager上报这些状态
应用提交
构造YarnClient实例,当yarnClient启动后,后遭application context, 准备包含有applicationMaster的第一个container, 然后提交应用。 你需要提交如下信息: 应用运行时所需的本地可用的jars信息, 需要被执行的命令, 以及系统环境变量的设置。 你还需要指定ApplicationMaster加载的线程数。
ResourceManager在分配好的container中加载一个applicationMaster, applicationMaster 与yarn集群通讯,驱动应用程序执行。 ApplicationMaster是以异步的方式执行这些操作。 在application 加载的过程中, ApplicationMaster主要任务是:
与Resourcemanager通讯,申请进一步的containers资源
当container资源分配后,联系NodeManagers将应用加载到container
任务:
通过AMRMClientAsync实例来异步执行任务, 实例需要在AMRMClientAsync.CallbackHandler中指明一个事件驱动的方法。 然后将该时间设置到client中
加载一个可运行的实例,然后加载一个分配好的container资源。 加载container的同时, AM指定了ContainerLaunchContext, 来接收命令行和系统环境等的参数
在application执行过程中, ApplicationMaster通过NMClientAsync与NodeManagers通讯。 所有的containers通过NMClientAsync.CallbackHandler来驱动。 一个典型的回调驱动可以驱动客户端start, stop,status update和error。 ApplicationMaster也会将执行的进度通过AMRMClientAsync.CallbackHandler的getProgress()告诉给ResourceManager。
Client<-->ResourceManager
By using YarnClient objects.
ApplicationMaster<-->ResourceManager
By using AMRMClientAsync objects, handling events asynchronously by AMRMClientAsync.CallbackHandler
ApplicationMaster<-->NodeManager
Launch containers. Communicate with NodeManagers by using NMClientAsync objects, handling container events by NMClientAsync.CallbackHandler
Writing a Simple Yarn Application
构造并启动yarn-client
YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start();
Last updated
Was this helpful?