YARN:分布式资源调度框架
1. YARN的架构:master/slaves的主从架构
-
组成
ResourceScheduler->资源调度器,根据节点的容量、队列情况,为应用程序分配资源 Application Manager->应用程序管理器,负责接受Client端传输的job请求
-
功能
1、处理客户端请求 2、监控NodeManager 3、启动和监控ApplicationMaster,进行必要的重启 4、整个系统的资源分配和调度
-
NodeManager
1、本节点上的资源管理和任务管理 2、定时向ResourceManager汇报本节点上的资源使用情况和各个Container的 使用信息 3、接收和处理来自ResourceManager的Container启动和停止的各种命令 4、处理来自ApplicationMaster的指令,比如启动MapTask和ReduceTask指令
-
ApplicationMaster
1、每个应用程序对应一个ApplicationMaster,负责单个应用程序的管理 2、负责数据切分:MapReduce 任务会根据 InputSplit 信息来进行数据切分 3、为应用程序向ResourceManager申请资源(Container),并分配内部任务(MapTask和ReduceTask) 4、与NodeManager通信来启动/停止任务,Task都是运行在Container中的 5、负责任务的监控和容错,当某些Task运行出错,进行容错处理
-
Container
1、Container是YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。 2、Container是YARN 框架的计算单元,是具体运行 Task(如 MapTask、ReduceTask)的基本单位。 3、Container像我们使用的虚拟机系统,就是在NodeManager 节点机器上分配一块独立的空间来运行任务。
2.YARN的工作机制
1.作业提交
(1)client调用job.waitForCompletion 方法,向整个集群提交 MapReduce作业;
(2)client向 ResourceManager(Application Manager) 申请一个作业 Id;
(3)ResourceManager给Client 返回该 job 资源的提交路径(HDFS 路径)和作业Id,每一个作业都有一个唯一的Id;
(4)Client 发送jar包切片信息和配置文件到指定的资源提交路径;
(5)Client 提交完资源后,向ResourceManager(Application Manager)申请运行job;
2.作业初始化
(6)当Application Manager收到 Client 的请求后,将该 job请求添加到容量调度器(Resouce Scheduler)中;
(7)调度器会将任务放到调度队列中,当执行到该请求时,会通知Application Manager分配容器;
(8)Application Manager指定某一个空闲的 NodeManager 领取到该 job,该 NodeManager 创建 Container,并启动 AppMaster;
(9)AppMaster下载 Client 提交的资源到本地,根据分片信息生成 MapTask 和ReduceTask
3.任务分配
(10)AppMaster向Resouce Scheduler申请运行多个MapTask任务资源;
(11)ResourceManager将运行MapTask任务配给空闲的多个NodeManager,NodeManager 分别领取任务并创建容器(Container)
4.任务运行
(12)AppMaster向接收到任务的NodeManager发送程序启动脚本,每个接收到任务的 NodeManager启动MapTask,MapTask对数据进行处理,并分区排序;
(13)MrAppMaster 等待所有MapTask运行完毕后,向 ResourceManager申请容器(Container)运行ReduceTask;
(14)程序运行完毕后,MrAppMaster会向ResourceManager申请注销自己
(15)YARN中的任务将其进度和状态返回给应用管理器, 客户端每秒向应用管理器请求进度更新, 展示给用户
5. 作业完成
除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用waitForCompletion()来检 查作业是否完成 。作业完成之后, 应用管理器和container 会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
3.资源调度器
- 先进先出调度器(FIFO)
FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应需求满足后再给下一个分配
- 容量调度器(Capacity Scheduler)
支持多个队列,每个队列可配置一定的资源量,每个队列都采用 FIFO 调度
策略。按照作业优先级和提交时间顺序,同时考虑用户资源量限制和内存限制对队列内任务排序。多个队列同时按照任务的先后顺序依次执行,也就是排在队列前面的最先执行,也是同时执行。
- 公平调度器(Fair Scheduler)
1、支持多队列,多用户,每个队列中的资源量可以配置,同一队列中的作业公
平共享队列中所有资源;
2、每个队列中的 job 按照优先级分配资源,优先级越高分配的资源越多,但是每个 job 都会分配到资源以确保公平;
3、在同一个队列中,job 的资源缺额越大,越先获得资源优先执行。作业是按照缺额的高低来先后执行的。