01 引言
参考资料:《Yarn【架构、原理、多队列配置】 》
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
02 yarn架构
yarn主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如下图:
2.1 ResourceManager
ResourceManager(RM)主要的作用如下:
- 处理客户端请求;
- 监控NodeManager;
- 启动或监控ApplicationMaster;
- 资源的分配与调度。
2.2 NodeManager
NodeManager(NM)主要作用如下:
- 管理单个节点上的资源;
- 处理来自ResouceManager的命令;
- 处理来自ApplicationMaster的命令。
2.3 ApplicationMaster
ApplicationMaster(AM)作用如下:
- 负责数据的切分;
- 为应用程序申请资源并分配给内部的任务;
- 任务的监控与容错。
2.4 Container
Container是yarn中的资源抽象,它封装了某个节点上的维度资源,如:内存、CPU、硬盘和网络等。
03 yarn工作原理
3.1 yarn工作机制
yarn工作机制图如下(图片来源于:https://www.cnblogs.com/wh984763176/p/13225690.html):
流程如下:
- MR程序提交到客户端所在的节点。
- YarnRunner向ResourceManager申请一个Application。
- RM将该应用程序的资源路径返回给YarnRunner。
- 该程序将运行所需资源提交到HDFS上。
- 程序资源提交完毕后,申请运行mrAppMaster。
- RM将用户的请求初始化成一个Task。
- 其中一个NodeManager领取到Task任务。
- 该NodeManager创建容器Container,并产生MRAppmaster。
- Container从HDFS上拷贝资源到本地。
- MRAppmaster向RM 申请运行MapTask资源。
- RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
- MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
- MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- ReduceTask向MapTask获取相应分区的数据。
- 程序运行完毕后,MR会向RM申请注销自己。
3.2 yarn任务提交流程
① 作业提交
- 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
- 第2步:Client向RM申请一个作业id。
- 第3步:RM给Client返回该job资源的提交路径和作业id。
- 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
- 第5步:Client提交完资源后,向RM申请运行MrAppMaster。
② 作业初始化
- 第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
- 第7步:某一个空闲的NM领取到该Job。
- 第8步:该NM创建Container,并产生MRAppmaster。
- 第9步:下载Client提交的资源到本地。
③ 任务分配
- 第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
- 第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个
NodeManager分别领取任务并创建容器。
④ 任务运行
- 第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
- 第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- 第14步:ReduceTask向MapTask获取相应分区的数据。
- 第15步:程序运行完毕后,MR会向RM申请注销自己。
⑤ 进度和状态更新
- YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
⑥ 作业完成
- 除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
04 yarn资源调度器
Hadoop作业调度器主要有三种:FIFO、Capacity Scheduler和Fair Scheduler。
Hadoop3.1.3默认的资源调度器是Capacity Scheduler。
具体设置详见:yarn-default.xml文件
<property> <description>The class to use as the resource scheduler.</description> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property>
4.1 FIFO调度器
先进先出:同一时间队列中只有一个任务在执行:
4.2 容量调度器
多队列:每个队列内部先进先出, 同一时间队列中只有一个任务在执行, 队列的并行度为队列的个数。
容量调度器支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略;
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定:
- 首先,计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列(即最闲的);
- 其次,按照作业优先级和提交时间的顺序,同时考虑用户资源量限制和内存限制对队列内任务排序。
如上图,三个队列同时按照任务的先后顺序依次执行,比如:job11,job21和job31分别排在队列最前面,先运行,也是并行运行。
4.3 公平调度器
多队列:每个队列内部按照缺额大小分配资源启动任务,同一时间队列中有多个任务执行。队列的并行度大于等于队列的个数
公平调度器有如下特点:
- 支持多队列多作业,每个队列可以单独配置;
- 同一队列的作业按照器优先级分享整个队列的资源,并发执行;
- 每个作业可以设置最小资源值,调度器会保证作业获得其以上资源;
- 设计目标是在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫“缺额”;
- 调度器会优先为缺额大的作业分配资源。
05 文末
本文主要讲解了yarn的组成、工作机制原理及其三种资源调度器,谢谢大家的阅读,本文完!