YARN 简介
YARN 是什么
YARN 是一种新的 Hadoop 资源管理器,它的引入为集群在利用率、资源统一管理和数据共享等方面带来巨大好处。
基本组成
YARN 主要由 ResourceManager、NodeManager、Container、ApplicationMaster、JobHistoryServer、Task、Client、job 组成。
- ResourceManager:
- 处理客户端请求
- 监控 NodeMananger
- 启动或监控 ApplicationMaster
- 计算资源的分配和调度
- NodeManager
- 管理单个节点上资源
- 处理来自 ResourceManager 的命令
- 处理来自 ApplicationMaster 的命令
- Container
- Container 是 YARN 中资源的抽象,封装了某个节点上的多维度资源,比如内存、CPU、磁盘、网络等。
- YarnChild 其实它就是一个运行程序的进程。MrAppMaster 运行程序时向 ResouceManager 请求的 Maptask / ReduceTask。
- ApplicationMaster
- 负责数据切分。
- 为应用程序申请资源并分配给内部任务。
- 任务的监控和容错。
- JobHistoryServer
负责查询 job 运行进度及元数据管理
- Task
一个具体做 Mapper 或 Reducer 的独立工作单元
- Client
将程序提交给 ResourceManager
- job
一个 Mapper、Reducer 或一个进程的输入列表,俗称 Application
YARN 调度 MapReduce 任务
![](https://i-blog.csdnimg.cn/blog_migrate/e86621573bd1b0774fc2a562db447693.png#pic_center)
- Client 调用 job.waitForCompletion 方法 YarnRunner 向集群提交作业,申请一个job
- RM 返回该 job 的资源提交路径和 job 的 id
- Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径
- 资源提交完后,Client 向 RM 申请运行 MrAppMaster
- RM 收到请求后,将 Task 放入调度队列
- 空闲的 NM 拿到 Task
- 该空闲的 NM 创建 Container 并产生 MrAppMaster
- MrAppMaster 向 AppManager 申请 AppMaster(让RM看到任务执行状态)
- 下载 Client 提交的资源到本地
- MrAppMaster 向 Scheduler 申请 MapTask 计算资源
- Scheduler 以 Container 形式回复资源列表,比如 node02 有资源可用
- MrAppMaster 向 RM 申请容器分配给 NM
- MrAppMaster 发送程序启动脚本,让 NM 启动 MapTask
- MrAppMaster 等所有的 MapTask 运行完后,再次向 RM 申请容器运行 ReduceTask
- ReduceTask 读取 Map 结果
- 向 MrAppMaster 汇报执行情况
- 运行完后,MrAppMaster 向 AppManager 申请注销自己
资源调度器
YARN 我们都知道主要是用于做资源调度,任务分配等功能的,那么 Hadoop 中,究竟使用什么算法来进行任务调度就需要我们关注了,Hadoop 支持好几种任务的调度方式,不同的场景需要使用不同的任务调度器,调度器主要有 3 种,分别是 FIFO、Capacity Scheduler、 Fair Scheduler。
- FIFO
把任务按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给
队列中最头上的任务进行分配资源,待最头上任务需求满足后再给下一个分配,以此类推。
![](https://i-blog.csdnimg.cn/blog_migrate/c654cba31884a5db825f9beda81e302f.png#pic_center)
- Capacity Scheduler
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
![](https://i-blog.csdnimg.cn/blog_migrate/68d44344e85d4e08b28c95907d0bcf07.png#pic_center)
- Fair Scheduler
Fair 调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。公平调度在也可以在多个队列间工作。举个例子,假设有两个用户 A 和 B,他们分别拥有一个队列。当 A 启动一个 job 而 B 没有任务时,A会获得全部集群资源;当 B 启动一个 job 后,A 的 job 会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时 B 再启动第二个 job 并且其它 job 还在运行,则它将会和B的第一个 job 共享 B 这个队列的资源,也就是 B 的两个 job 会用于四分之一的集群资源,而 A 的 job 仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。
![](https://i-blog.csdnimg.cn/blog_migrate/8f4087926121f5613a28e57c455ac809.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ff61f378b77effa844f76cf16c9692.png#pic_center)
MapReduce 1.x 与 YARN 的对比
在 MapReduce 1.x 中,任务调度是 JobTracker,任务执行是 TaskTracker;而在 MapReduce 2.x 中,引入了 YARN,YARN 中的 ResourceManager负责任务资源的分配,ApplicationMaster 负责任务进度监控的工作,大大提升了 MapReduce 的性能。
分工 | MapReduce 1.x | YARN |
---|---|---|
作业调度、任务监控 | JobTracker | ResourceManager、ApplicationMaster |
任务执行 | TaskTracker | NodeManager |
资源调度单元 | Slot | Container |
其他系列文章: