Yarn资源调度器
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序相当于操作系统之上的应用程序
Yarn基本架构
Yarn主要由ResourceManager,NodeManager,ApplicationMaster和Container等组件构成
- YARN 是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。
- ResourceManager 负责所有资源的监控、分配和管理。
- ApplicationMaster 负责每一个具体应用程序的调度和协调。
- NodeManager 负责每一个节点的维护。
- 对于所有的 applications,RM 拥有绝对的控制权和对资源的分配权。而每个 AM 则会和RM 协商资源,同时和 NodeManager 通信来执行和监控 task。
Yarn工作机制
- 当我们执行一个diver调用waitForCompletion方法时,Mr会向ResourceManager申请一个Application(也就是jobID)
- ResourceManager分配一个Application资源提交路径以及application_id
- 有了这个id,job就知道提交时所用的临时文件,提交到哪个路径下,并在临时申请的工作目录里面生成一些文件(jar包,切片信息,和配置文件),提交这个job运行所需要的资源
- 在工作目录中提交完所用资源之后,Mr会向ResourceManager申请运行AppMaster
- 通过申请之后,ResourceManager会将job包装成一个Task,然后将此Task放入调度队列中,有自己的调度规则
- 当轮到此Task执行任务时,ResourceManager会寻找一个NodeManager负责接收这个Task
- 当NodeManager领取到Task任务后,创建Container容器,并由Appmaster来运行这个Container
- Appmaster开始运行job时,会去临时工作目录中下载响应的job资源
- 资源下载完毕后,根据job.split(切片信息),Appmaster向ResourceManager申请响应数量的MapTask容器,此申请同样进入调度队列,等待调度
- 调度完成后,会以相同方式启动响应数量的Container,来准备运行对应MapTask
- 此时Appmaster会向这些MapTask发送启动脚本与jar包,紧接着MapTask根据对应的执行jar包来执行任务
- MapTask执行完毕过程中,Appmaster会不停询问执行进度,进度100%后,生成map的结果数据。接着申请相应的Container来运行ReduceTask
- 每个ReduceTask接收MapTask的结果数据,对数据进行处理,处理完成后,生成最终结果数据
- 执行结果生成后各个Container会被RM回收,而Appmaster会向RM申请自杀
资源调度器
目前,Hadoop资源调度器主要由三种:FIFO,Capacity Scheduler和Fair Scheduler,默认的资源调度器时Capacity Scheduler
FIFO调度器
先进先出调度器,在进行资源分配的时候,先给队列中最开始的应用进行分配资源,待最开始的应用需求满足后再给下一个分配,以此类推。但是大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。
容量调度器(Capacity Scheduler)
支持多个队列,每个队列可以配置一定的资源量,每个队列采用FIFO调度策略。
为了防止同一个任务作业独占列队中的资源,该调度器会对同一任务提交所占资源量进行限定
- 首先,计算每个列队中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的列队(最闲的)
- 其次按照任务优先级与提交时间顺序,同时考虑用户资源量限制和内存限制对列队内任务排序
公平调度器(Fair Scheduler)
公平调度是一种对于全局资源,对于所有应用作业来说,都均匀分配的资源分配方法。YARN有能力调度多种资源类型。默认情况,公平调度器FairScheduler基于内存来安排公平调度策略。也可以配置为同时基于内存和CPU来进行调度,这样情况下需要使用由Ghodsi开发的Dominant Resource Fairness进行。当只有一个单一应用作业运行时,这个应用可以独占整个集群。当其他应用作业提交到集群时,空出来的资源将分配给新的应用,最终所有的应用作业会平分集群资源。不像Hadoop的默认调度器,它只将任务构造一个应用队列,公平调度器会在不饿死长周期作业的同时,优先让短周期作业先运行完成。在一组用户中共享集群也是合理的。最终,公平调度策略可以和应用优先级结合起来工作,优先级是一组权重值,资源会按照这个权重比例来分配给每个应用。