yarn是一个资源调度平台,相当于一个分布式的操作系统平台,负责为运算程序提供服务器运算资源,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
1.Yarn基础架构
核心组件:
- ResourceManager
- NodeManager
- ApplicationMaster
- Container
ResourceManager(RM)
职责:
(1)接收Yarn客户端的请求,比如提交计算作业(MR、Spark、Flink)
(2)监控NodeManager 的资源(CPU\内存)
(3)启动和监控ApplicationMaster (AppMaster是一个进程,一个计算作业对应一个AppMaster)
(4)集群资源的分配和调度
NodeManager(NM)
职责:
(1)管理单个节点的资源
(2)处理来自RM的命令
(3)处理来自ApplicationMaster的命令
ApplicationMaster(AM)
职责:
(1)为计算程序(一个MR、Spark、flink任务)申请计算所需要的资源并且分配给内部的任务
(2)监控MapTask、ReduceTask
如果某个Task计算任务挂了,就会重新申请资源来执行task
Container
是yarn集群中资源的抽象,封装了NodeManager节点上的多种资源(内存、cpu、磁盘、网络等);
AppMaster、MapTask、ReduceTask等进程都是运行在Container中的;所以Container就是一个子任务的运行容器;
2.Yarn工作流程
在命令行中执行hadoop jar xxx 一个MR程序会走怎样的流程?
(0)MR的Driver类中,提交任务job.waitForCompletion()方法会创建一个客户端,本地模式下叫localRunner,集群模式下叫YarnRunner
(1)YarnRunner向ResourceManager申请运行一个应用程序(计算任务)
(2)RM将该应用程序(计算Job)的一些信息所要存放的路径返回给YarnRunner
(1)job的相关信息
- Job.split 切片信息;控制MapTask的个数
- job.xml job所需要的资源配置信息
- wc.jar jar包;MR程序代码
(2)job信息存放路径
如果是本地模式,那么就在本地机器上创建一个staging目录来存放
如果是集群模式,在hdfs的一个staging目录中存放
(3)YarnRunner该job运行所需的信息提交到HDFS上的指定目录中
(4)job资源提交完毕后,向RM申请运行mrAppMaster进程
(5)RM将请求初始化成一个Task,放进调度队列中,等待调度执行
(6)Task被调度的时候,其中一个NodeManager会领取到Task,紧接着该NodeManager创建容器Container,来运行MRAppmaster进程
(8)Appmaster进程会从HDFS上拷贝job的配置信息到本地节点
(9)Appmaster拿到job配置信息后,也就有了切片信息,此时AM会向RM 申请运行MapTask的资源
申请在NodeManager节点上开启task进程的请求都会被封装成Task进入ResourceManager的任务调度器中,调度执行
(10)RM会在有资源的NodeManager节点上创建容器来运行MapTask任务
如果NodeManager节点资源充足,同时分配多个container来运行MapTask也是ok的
(11)此时MapTask的容器有了,MRAppmaster会向两个接收到任务的NodeManager发送程序启动脚本,分别启动MapTask
(12) MapTask执行完毕,会在NodeManager上产生结果分区且区内有序的结果数据,一个MapTask对应一个
(13)MrAppMaster等待所有MapTask运行完毕后,再次向RM申请容器,运行ReduceTask进程
(1)这里说等待所有MapTask运行完毕后,申请运行ReduceTask是不严谨的;
Hadoop有优化机制会提前ReduceTask的执行
(2) MapTask执行完了就会销毁容器
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后&