Hadoop 之 Yarn
Yarn的架构

-
ResourceManager:资源管理,主要负责整个yarn的资源调度与分配。
- 处理客户端的任务请求。
- 监控NodeManager。
- 启动或监控ApplicationMaster。
- 负责资源的分配与调度。
-
NodeManager:节点管理器,主要负责单个节点上的资源并向ResourceManager汇报。
- 管理单个节点上的资源。
- 处理来自ResourceManager的命令。
- 处理来自ApplicationMaster的命令。
-
ApplicationMaster:是MapReduce的管理者,负责资源的申请。
- 为应用程序申请资源并分配内部任务。
- 负责任务的监控与容错。
说明:
- 如果某个NodeManager存在问题,导致节点挂掉,AppMaster会重新向ResourceManager申请节点资源资源。
- 如果某个节点的Container损坏,AppMaster也会重新向ResourceManager申请资源,ResourceManager分配一个除当前损坏节点外的空闲节点。
- 若AppMaster所在的节点损坏,会导致整个MapReduce任务失败。
-
Container:类似与一个容器。
- Container是yarn资源的抽象,封装了某个节点的多维度资源。
Yarn上Job的提交流程
作业提交:
1.客户端调用 Job对象的waitForCompletion()方法向整个集群提交MapReduce作业,该方法调用Submit()方法创建一个JobSummiter实例,
调用其submitJobInternal()方法,检查作业输出说明,例如没有指明输出目录或输出目录已存在,则不提交作业,错误抛回给MapReduce程序;
并且通过writeSplits()方法计算作业的输入分片,如果分片无法计算,比如输入路径不存在,则作业不提交,错误抛回给MapReduce程序。
作业提交后waitForCompletion()每秒轮询作业进度。
2.客户端向ResourceManager申请一个新的Application。
3.ResourceManager 收到来自客户端的 Application请求后会向客户端返回一个资源提交的临时路径以及Application_id。
4.客户端根据ResourceManage返回的资源提交临时路径去提交任务运行所需要资源,如作业JAR文件、配置文件、计算后的输入分片。
5.客户端通过YarnRunner调用SubmitApplication()方法向ResourceManager提交作业,申请MRAppMaster。
作业初始化:
6.当ResourceManager收到请求后,将作业添加到YARN调度器中等待。
7.调度器分配一个合适Container,然后ResourceManager在NodeManager的管理下在Container启动Application Master进程。
8.Application Master对作业初始化,从资源提交临时路径加载任务所需的资源,并根据分片创建相应map task和 reduec task。
任务分配:
9.待所有资源准备就绪后,Application Master 开始向 ResourceManager 申请相应的 MapTask容器。
10.直到有5%的MapTask 任务运行结束Application Master就开始向 ResourceManager 申请资源运行 ReduceTask。
任务执行:
11.领取到 ResourceManger 分发的 MapTask 任务后开始创建 Container 容器。
12.MapTask启动前先将任务需要的资源本地化,Application Master 向领取到 MapTask 任务的 NodeManager 发送任务资源,
然后 MapTask 开始对数据进行分区排序,最后归并排序。
13.当 Reduce Task 启动后向 MapTask 获取相应分区的数据,并进行归并排序最后分组。
作业完成:
14.所有任务运行结束后Application Master把作业状态设置为成功,然后从waitForCompletion()方法返回。
Yarn调度器
- FIFO 先进先出: 支持单队列 、先进先出 生产环境不会用。
- Capacity Scheduler 容量调度器:支持多队列,保证先进入的任务优先执行,支持抢占式。 Apache默认。
- Fair Sceduler 公平调度器:支持多队列,保证每个任务公平享有队列资源,支持抢占式。 CDH默认。

浙公网安备 33010602011771号