Hadoop三大核心组件之YARN
一、YARN 简介
Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。核心思想是将资源管理和任务的监控和调度分离,用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配
二、YARN 基本架构
2.1、master/slave 主从架构
- master:ResourceManager
负责集群全局统一的资源管理、调度、分配 - slave:NodeManager
负责管理节点的资源及使用情况
2.2、核心组件
2.2.1、ResourceManager
-
ResourceManager组件:
Application Manager
应用程序管理器,负责处理Client端传输的job请求,为应用程序分配第一个 Container 来运行 ApplicationMaster,负责监控 ApplicationMaster,并在遇到失败时重启 ApplicationMaster 运行的 Container
ResourceScheduler
资源调度器,根据节点的资源情况、队列情况,为应用程序分配资源,只负责
给用户提交的应用分配 Container(资源) -
ResourceManager功能:
1、处理客户端请求
2、监控NodeManager,监控 NodeManager心跳,发送指令给NodeManager
3、启动和监控ApplicationMaster
4、整个系统资源的分配和调度
2.2.2、NodeManager
- NodeManager功能:
1、管理本节点上的资源、任务
2、定时向ResourceManager汇报本届点上的资源情况和Container的运行情况
3、处理来自ResourceManager的指令,例如Container启动和停止
4、处理来自ApplicationMaster的指令,例如启动MapTask和ReduceTask
2.2.3、ApplicationMaster
- ApplicationMaster功能:
1、一个ApplicationMaster负责管理一个应用程序
2、负责数据的切分。比如 MapReduce 任务会根据 InputSplit 信息来进行数
据切分
3、为应用程序向ResourceScheduler申请资源(Container),并内部分配任务(MapTask/ReduceTask)
4、与NodeManager通信来启动/停止任务,任务都是在Container中运行的
5、内部任务的监控和容错
2.2.4、Container
一个节点可以运行多个 Container,但是需要明确的是 Container 不能跨多个机器。
- Container功能:
1、Container是YARN中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等
2、Container类似于一个虚拟机,可以在上面执行任务
三、YARN 工作机制
3.1、作业提交
(1)client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
(2)client向ResourceManager申请一个作业Id。
(3)ResourceManager给Client返回该job资源的提交路径(HDFS路径)和作业Id,每一个作业都有一个唯一的Id。
(4)Client发送jar包、切片信息和配置文件到指定的资源提交路径。
(5)Client提交完资源后,向ResourceManager申请运行MrAppMaster(针对该job的ApplicationMaster)。
3.2、作业初始化
(6)当ResourceManager收到Client的请求后,将该job添加到容量调度器(Resouce Scheduler)中。
(7)某一个空闲的NodeManager领取到该job。
(8)该NodeManager创建Container,并产生MrAppMaster。
(9)下载Client提交的资源到本地,根据分片信息生成MapTask和ReduceTask。
3.3、任务分配
(10)MrAppMaster向ResouceManager申请运行多个MapTask任务资源。
(11)ResourceManager将运行MapTask任务分配给空闲的多个NodeManager,NodeManager分别领取任务并创建容器(Container)。
3.4、任务运行
(12)MrAppMaster向两个接收到任务的NodeManager发送程序启动脚本,每个接收到任务的NodeManager启动MapTask,MapTask对数据进行处理,并分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向ResourceManager申请容器(Container),运行ReduceTask。
(14)程序运行完毕后,MrAppMaster会向ResourceManager申请注销自己。
(15)进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。可以使用YARN WebUI查看任务执行状态。
3.5、作业完成
除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
四、YARN 资源调度器
4.1、先进先出调度器(FIFO)
FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler 是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用 Capacity Scheduler 或 Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
4.2、容量调度器(Capacity Scheduler)
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
支持多个队列,每个队列可配置一定的资源量,每个队列都采用 FIFO 调度策略。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
4.3、公平调度器(Fair Scheduler)
支持多队列,多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源。
比如有三个队列 queue1、Queue2、Queue3,每个队列中的 job 按照优先级分配资源,优先级越高分配的资源越多,但是每个 job 都会分配到资源以确保公平。在资源有限的情况下,每个 job 理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距就叫做差额。在同一个队列中,job 的资源缺额越大,越先获得资源优先执行。作业是按照缺额的高低来先后执行的。在 Fair调度器中,我们不需要预先占用一定的系统资源,Fair 调度器会为所有运行的 job动态的调整系统资源。
五、YARN常用命令
5.1、yarn 命令列表
5.2、yarn application 命令
5.3、查看正在运行的任务列表
工作常用
yarn application -list
5.4、杀掉正在运行的任务
面试和工作常用
yarn application -kill 任务id
5.5、查看节点列表
yarn node -list
5.6、查看节点状况
yarn node -status 节点id
5.7、查看yarn 依赖 jar 的环境变量
yarn classpath