说明
了解Yarn架构之前,先要了解两个概念。 作业。也可称为应用程序,包含一个或多个任务。 任务。在运行MapReduce时,一个任务可以是一个Mapper或一个Reducer。
Yarn关键组件[1]
ResourceManager
ResourceManager由两个关键组件Scheduler和ApplicationsManager组成。
Scheduler
Scheduler在容量和队列限制范围内负责为运行的容器分配资源。Scheduler是一个纯调度器(pure scheduler),只负责调度,它不会监视或跟踪应用程序的状态,也不负责重启失败任务,这些全都交给ApplicationMaster完成。Scheduler根据各个应用程序的资源需求进行资源分配。
ApplicationsManager
ApplicationManager负责接收作业的提交,然后启动一个ApplicationMaster容器负责该应用。它也会在ApplicationMaster容器失败时,重新启动ApplicationMaster容器。
NodeManager
Hadoop 2集群中的每个DataNode都会运行一个NodeManager来执行Yarn的功能。每个节点上的NodeManager执行以下功能:
- 定时向ResourceManager汇报本节点资源使用情况和各个Container的运行状况
- 监督应用程序容器的生命周期
- (监控资源)监控、管理和提供容器消耗的有关资源(CPU/内存)的信息
- (监控资源使用情况)
- (监控容器)监控容器的资源使用情况,杀死失去控制的程序
- (启动/停止容器)接受并处理来自ApplicationMaster的Container启动/停止等各种请求。
ApplicationMaster
提交到Yarn上的每一个应用都有一个专用的ApplicationMaster(注意,ApplicationMaster需要和ApplicationManager区分)。ApplicationMaster运行在应用程序启动时的第一个容器内。ApplicationMaster会与ResourceManager协商获取容器来执行应用中的mappers和reducers,之后会将ResourceManager分配的容器资源呈现给运行在每个DataNode上的NodeManager。ApplicationMaster请求的资源是具体的。包括:
- 处理作业需要的文件块
- 为应用程序创建的以容器为单位的资源
- 容器大小(例如,1GB内存和一个虚拟核心)
- 资源在何处分配,这个依据从NameNode获取的块存储位置信息(如机器1的节点10上分配4个容器,机器2的节点20上分配8个容器)
- 资源请求的优先级
ApplicationMaster是一个特定的框架。例如,MapReduce程序是MRAppMaster,spark是SparkAppMaster。
Container
Container是对于资源的抽象, 它封装了某个节点上的多维度资源,如内存、CPU等。
Yarn工作流程
- 客户端向ResourceManager提交应用程序。
- ResourceManager的ApplicationManager组件指示NodeManager(运行在每一个工作节点的其中一个)为应用程序启动一个新的ApplicationMaster容器。
- ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过NodeManager查看应用程序的运行状态。
- ApplicationMaster计算应用完成所需要的资源,然后向ResourceManager申请需要的资源(容器)。ApplicationMaster在应用程序的整个生命周期内与ResourceManager保持联系,确保其所需要资源的列表被ResourceManager严格遵守,并且发送一些必要的Kill请求杀死任务。
- 申请到资源后,ApplicationMaster指示NodeManager在对应的节点上创建容器。
- NodeManager创建容器,设置好运行环境,然后启动容器。
- 各个容器定时向ApplicationMaster发送任务的运行状态和进度,这样ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
- 应用程序完成后,ApplicationMaster会通知ResourceManager该作业已经完成并注销关闭自己。
这里要注意几点。第一,NodeManager会将节点状态和健康状况发送到ResourceManager,ResourceManager拥有全局资源视图才能分配资源。第二,ResourceManager的Scheduler组件决定容器在哪个节点上运行。