Apache Hadoop YARN 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度
前言
Yarn 在 Hadoop 生态圈中起到一个资源调度的作用,全文摘自以下链接拼凑出来
出身
Hadoop1.x 中 JobTracker 具有两种不同的职责
- ResourceManagement 资源管理
- JobScheduling/JobMonitoring 任务调度监控
为单个进程安排大量职责会导致重大的可伸缩性问题,尤其是在较大的集群上,JobTracker 必须不断跟踪数千个 TaskTracker、数百个作业,以及数万个 map 和 reduce 任务。
相反,TaskTracker 通常近运行十来个任务,这些任务由勤勉的 JobTracker 分配给它们。
大型 Apache Hadoop 集群 (MRv1) 上繁忙的 JobTracker
Hadoop2.x Yarn 的目标是将这两部分功能分开,也就是分别用两个进程来管理这两个任务
- ResourceManger
- ApplicationMaster
需要注意的是,在Yarn中把 job 的概念换成了 application
组件
- ResourceManager:Global(全局)的进程
- NodeManager:运行在每个节点上的进程
- ApplicationMaster:Application-specific(应用级别)的进程
- Scheduler:是ResourceManager的一个组件
- Container:节点上一组CPU和内存资源
Container是Yarn对计算机计算资源的抽象,它其实就是一组CPU和内存资源,所有的应用都会运行在Container中。ApplicationMaster是对运行在Yarn中某个应用的抽象,它其实就是某个类型应用的实例,ApplicationMaster是应用级别的,它的主要功能就是向 ResourceManager(全局的)申请计算资源(Containers)并且和 NodeManager 交互来执行和监控具体的task。Scheduler是ResourceManager专门进行资源管理的一个组件,负责分配NodeManager上的Container资源,NodeManager也会不断发送自己Container使用情况给ResourceManager
各组件详解翻阅开头推荐链接
提交作业
Application 在 Yarn 中的执行过程,整个执行过程可以总结为三步
- 应用程序提交
- 启动应用的ApplicationMaster实例
- ApplicationMaster实例管理应用程序的执行
客户端程序向ResourceManager提交应用并请求一个ApplicationMaster实例
ResourceManager找到可以运行一个Container的NodeManager,并在这个Container中启动ApplicationMaster实例
ApplicationMaster向ResourceManager进行注册,注册之后客户端就可以查询ResourceManager获得自己ApplicationMaster的详细信息,以后就可以和自己的ApplicationMaster直接交互了
在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送resource-request请求
当Container被分配之后,ApplicationMaster请求被分配到的 NodeManager 启动Container ,启动成功后 ,ApplicationMaster 向NodeManager发送container-launch-specification信息来启动Container, container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的资料
应用程序的代码在启动的Container中运行,并把运行的进度、状态等信息通过application-specific协议发送给ApplicationMaster
在应用程序运行期间,提交应用的客户端主动和ApplicationMaster交流获得应用的运行状态、进度更新等信息,交流的协议也是application-specific协议
一但应用程序执行完成并且所有相关工作也已经完成,ApplicationMaster向ResourceManager取消注册然后关闭,用到所有的Container也归还给系统
Resource Request 和 Container
ApplicationMaster 资源请求以 resource-request
的形式发送给 ResourceManager 的 Scheduler,
Scheduler 在这个原始的 resource-request
中返回分配到的资源描述Container
包含的字段信息如下
1 | <resource-name, priority, resource-requirement, number-of-containers> |
- resource-name:资源名称,现阶段指的是资源所在的host和rack,后期可能还会支持虚拟机或者更复杂的网络结构
- priority:资源的优先级
- resource-requirement:资源的具体需求,现阶段指内存和cpu需求的数量
- number-of-containers:满足需求的Container的集合
number-of-containers中的Containers就是ResourceManager给ApplicationMaster分配资源的结果。Container就是授权给应用程序可以使用某个节点机器上CPU和内存的数量。
ApplicationMaster在得到这些Containers后,还需要与分配Container所在机器上的NodeManager交互来启动Container并运行相关任务。当然Container的分配是需要认证的,以防止ApplicationMaster自己去请求集群资源。
有些提到了还有位置字段。。。 这个看来有说法,有空再看看源码之类的确认下。。