Yarn个人总结
个人学习过程中总结,如有不同见解望交流。
一、Yarn是什么:(yet another resource Negotiator,另一种资源协调者)yarn是一种分布式资源管理调度框架,是mrv1分支的另一种资源协调框架。
先介绍下mrv1:mrv1也是一种master-slave形式的资源协调框架,由一个JobTracker和多个TaskTracker组成。其一个JobTracker管理所有TaskTracker的结构,一旦JobTracker发生宕机,整个集群都将无法继续运行。为了解决mrv1的可用性问题,Yarn应运而生。
MRv1 存在的主要问题: 1. JobTracker 单点故障,如果它挂掉,整个系统无法运转 2.JobTracker 负载过重,限制了集群扩展,随着节点规模的增大,称为集群的瓶颈 3. 仅支持 MR 计算框架,适合批处理、基于磁盘的计算 4.资源与计算没有很好的解耦设计,一个集群只能使用一个计算框架,如 Hadoop&MapReduce 集群、Spark 集群、Tez 集群等。造成管理复杂、资源利用率低的难题
综上所述 MRv1 有以上缺陷:扩展性受限、单点故障、难以支持 MR 之外的计算框架。多计算框架
二、yarn的特点
1.资源管理与计算框架解耦设计,一个集群资源共享给上层各个计算框架,按需分配,大幅度
提高资源利用率
2. 运维成本显著下降,只需运维一个集群,同时运行满足多种业务需求的计算框架
3. 集群内数据共享一致,数据不再需要集群间拷贝转移,达到共享互用
4. 避免单点故障、集群资源扩展得到合理解决
三、yarn架构设计
YARN 总体上仍然是 Master/Slave 结构,在整个资源管理框架中,ResourceManager 为 Master,
NodeManager 为 Slave。YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container等几个组件构成。
yarn架构图:
基本组成:
1.Client:面向用户提交的 Driver 代码,作为用户编程的接口,与 ResourceManager 交互。
2. ResourceManager:整个集群只有一个是存活(active)的,负责集群资源的统一管理和调度
(1)负责整个集群的资源分配和调度
(2) 处理来自客户端的请求,启动、杀死应用程序
(3)启动、监控 ApplicationMaster,一旦一个 AM 挂了之后,RM 将会在另一个 NodeManager
上启动该 AM
(4) 监控 NodeManager,接收 NM 的心跳汇报信息,获取 NM 的资源使用情况和 Container 运行
状态
3.NodeManager:整个集群中有多个,负责单节点资源管理和使用。
(1)负责单个节点上的资源管理和任务调度
(2)处理来自 ApplicationMaster 的命令
(3) 接收并处理来自 ResourceManager 的 Container 启动、停止的各种命令
(4)周期性向 ResourceManager 汇报本节点上的资源使用情况和 Container 的运行状态
4. ApplicationMaster:每个应用程序特有,负责应用程序的管理
(1)数据切分
(2) 为应用程序/作业向 ResourceManager 申请资源(Container),并分配给内部任务
(3) 与 NodeManager 通信以启动、停止任务
(4) 任务监控和容错(在任务执行失败时重新为该任务申请资源以重启任务)
(5) 处理 ResourceManager 发来的命令,让 NodeManager 重启任务、杀死 Container 等
5.Container:对任务运行环境的抽象
(1)任务运行资源的抽象,封装了某个节点上的多维度资源,如内存、cpu、磁盘、网络等
(2)任务命令启动、停止的执行单元
(3)任 务 运 行 环 境 , 任 务 运 行 在 Container 中 , 一 个 Container 中 既 可 以 运 行
ApplicationMaster 也可以运行具体的 MapReduce、MPI、Spark 等任务
四、Yarn的运行流程
- 用户向 YARN 中提交应用程序/作业,其中包括 ApplicationMaster 程序、启动
ApplicationMaster 的命令、用户程序等。 - ResourceManager 为作业分配第一个 Container,并与对应的 NodeManager 通信,要求它在这
个 Container 中启动该作业的 ApplicationMaster。 - NodeManager 启动一个 Container 运行 ApplicationMaster。
- ApplicationMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManager
查询该作业的运行状态;然后它将为各个任务申请资源并监控任务的运行状态。
如果 Container 没有完全申请到位,则会先使用已经分配到位的部分 Container 资源进行后续的
第 5、6、7 步骤,其余 Container 部分由 ApplicationMaster 采用轮询的方式通过 RPC 请求向
ResourceManager 申请和领取资源,直到全部资源分配到位。 - 一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。
- NodeManager 执行 ApplicationMaster 发送的命令,启动 Container 任务。
- 各 个 Container 通 过 RPC 向 ApplicationMaster 汇 报 自 己 的 状 态 和 进 度 , 以 让
ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
在作业运行过程中,用户可以随时通过 RPC 向 ApplicationMaster 查询作业当前运行状态。 - 作业完成后,ApplicationMaster 向 ResourceManager 申请注销并关闭自己。
五、Yarn调度策略
1、FIFO Scheduler:队列式调度器,将所有用户的任务请求排成一个队列,遵循先进先出(first in first out)的原则,不支持抢占。这样必然会带来队列堵塞和资源浪费,因此通常不会在生产环境中使用。
2、Capacity Scheduler:容器式调度器,为每个用户都分配一个队列,队列的内部也是遵循FIFO的原则。(也可以设置成Fair)
3、Fair Scheduler:公平调度器,支持抢占,用户提交的任务会被合理的分配,用户共享集群,也可划分自己的队列(队列的内部也是遵循Fair调度策略)。在用户资源闲置或轻松时,其他任务也可以同时占用闲置资源。在有任务提交后再让出资源。
六、yarn命令
查看版本信息:yarn version
使用 yarn 命令提交 jar 包: yarn jar jarName mainClassPath -Dk1=v1 -Dk2=v2 inputPath outputPath
获取 yarn 运行时的 classpath 值:yarn classpath
查看所有 application 列表信息:yarn application -list
杀掉指定的 application:yarn application kill app-id
查看 yarn 的当前资源使用情况:yarn top