YARN (Yet Another Resource Negotiator)
是什么
是为了弥补Mapreduce的缺点,用来完全取代MapReduce的集群资源管理器,也称做MR2.
弥补了哪些缺点或者说有什么区别呢
- MR2可以面向其他大数据应用如(Spark/storm/flink)
- mapreduce中JobTracker要同时负责任务调度,监控,负责重启,MR2将这些任务进行了拆分减轻了JobTracker负担,提高了集群的扩展性(JobTracker在4000节点和40000任务会产生瓶颈,MR2在10000节点和100000任务才会产生瓶颈)
- 因为MR2中有Resource Schedule(将Cpu,内存,网络资源,磁盘IO等进行了抽象封装)专门进行资源的管理可以对资源更精细的管理。MapReduce配置时就会分配好固定长度的slot,所以会造成资源的浪费
下面先看一张架构图,然后分析一下各个组件的功能
组件详细介绍
- ResourceManager
- ResourceScheduler
- 只负责集群资源调度
- 调度器选项
- 容量调度器
- 公平调度器
- 队列调度器
- ApplicationManager
- 接受客户端job请求,为应用分配第一个container(资源池)运行第一个ApplicationMaster
- 负责监控ApplicationMaster,失败时重启ApplicationMaster
- ResourceScheduler
- NodeManager
- 负责与ApplicationManager通信
- 负责与ApplicationMaster的通信
- 负责开辟资源池并启动任务
- ApplicationMaster [MRAppMaster] (每个人任务都会产生一个ApplicationMaster)
- 向ResourceScheduler请求获取资源
- 与NodeManager通信,获取启动任务,停止任务的信息NodeManagerj开辟资源池(Container)给ApplicationMaster
- 监控这个应用所有任务的运行,如果失败则会重新向RsourceSchedule申请资源,然后由NodeManager分配资源池启动任务
- container
- 计算机资源抽象,封装了内存,cpu,磁盘,网络,IO等
- 切分出一个可以单独运行任务的容器
看完了组件的介绍下面该是最重要的部分了,它是怎么启动一个任务的呢?
YARN启动任务的流程
- client向ResourceManager申请运行任务,申请Job一个唯一的JobID
- ResourceSourceManager返回JobId并返回一个stage路径(HDFS的临时目录):HDFS//…/JobId_12123
- 客户端会上传Jar包,切片信息,任务规划信息,配置信息等到stage路径
- 上传成功给ApplicationManager发送消息,请求继续执行任务
- 将请求转发给Resource Schedule请求资源
- 资源请求到后,命令NodeManager开辟资源池并启动第一个ApplicationMaster用于管理整个任务的运行
- ApplicationMaster读取临时目录的信息,根据切片信息,任务规划计算需要申请的资源
- 然后会与ResourceSchedule通信,请求获取资源
- 请求到资源后,AppMaster会想NodeManger请求开辟资源池并启动任务(负载均衡在各个节点)
- 开启的任务会根据需要获取数据文件并开始运行任务
下面聊一下实际工作中需要使用到的调度器
YARN的调度选项
1. FIFO调度器
原理:根据名字可以看出是按照应用先后提交的顺序来 运行应用的
缺点:显而易见,当运行一些小任务时由于前面在运行的大任务会一直阻塞。
优点: 大任务会占据整个资源运行,可以减少大任务的运行时间
1. 容量调度器 (弹性队列)(出自yahoo)
为不同组织分配不同的队列,队列中的任务使用FIFO的调度策略。
特点
- 充分利用资源如果一个队列中有多个任务,且资源不够而集群中有其他空闲资源会被改队列使用。可以设置一个最大值来控制该队列会抢占大量的资源
- 支持抢占:开启抢占后允许调度器终止占用资源超过其队列的容器,终止的容器会在之后重新执行因此会降低集群的效率。
队列配置可以看成一个树型的结构如下面这样的队列
root
|—prod
|—dev
|— eng
|— science
具体配置可参考如下
我们可以看到dev的队列设置了一个75%的最大值,所以即使prod有空闲资源,dev也不能占用全部的集群资源,也就是说prod总是有其他25%的空闲资源可用,另一方面prod没有设置最大值,可能会使用到整个的集群资源。eng和science没有设置最大值,可能会使用到dev最大75%的集群资源
2. 公平调度器 (出自facebook)
为所有的应用公平的分配资源,可以动态平衡作业的资源,它里面的队列不是设置具体容量而是设置权重。假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,实现在两个用户之间平等的共享
- 队列内部调度策略
- FIFO
- 公平调度(默认如上面的举例)
- DRF(dominant Resource Fairness)
感谢大家看我的文章,今天Yarn的介绍就到这里为止了,如有问题可以私信或者email我,大家一起学习共同进步。