前言在前面的实验中我们已经通过Shell命令和Web界面与YARN进行过交互也利用YARN提交和监控过MapReduce作业。但YARN作为Hadoop生态的资源调度大脑其底层架构和工作机制远比表面看到的复杂。本文将从YARN基础架构、作业提交流程、三大调度器对比和生产环境核心参数调优四个维度结合架构图与源码逻辑带你彻底掌握YARN的设计精髓。一、YARN的定位与核心价值YARNYet Another Resource Negotiator是Hadoop 2.x引入的分布式资源调度平台解决了Hadoop 1.x中JobTracker单点瓶颈和资源管理僵化的问题。YARN的两大核心使命使命说明集群资源统一管理将多台服务器的CPU、内存、磁盘、网络资源池化统一调度任务合理分配根据应用需求将任务分配到最合适的节点执行实现数据局部性可以把YARN理解为分布式操作系统MapReduce、Spark、Flink等计算框架都是运行在其上的应用程序。二、YARN基础架构详解2.1 四大核心组件YARN由ResourceManager、NodeManager、ApplicationMaster和Container四大组件构成各司其职协同工作。2.2 组件职责深度解析① ResourceManagerRM—— 集群资源老大RM是整个集群资源的全局管理者负责职责详细说明处理客户端请求接收作业提交、查询、终止等请求监控NodeManager通过心跳机制掌握各节点资源使用情况启动/监控ApplicationMaster为每个应用启动AM并监控其存活状态资源分配与调度根据调度策略将Container分配给各应用RM内部架构ResourceTrackerServer接收NodeManager的心跳汇报ApplicationMasterService处理AM的资源申请和状态汇报ClientRMServer处理客户端的请求② NodeManagerNM—— 单节点资源老大NM是单个节点的资源管理者负责职责详细说明管理单节点资源监控本机CPU、内存、磁盘使用情况执行RM命令创建/销毁Container启动AM和任务处理AM命令接收AM的任务启动、停止指令定时向RM汇报心跳机制汇报节点状态和Container运行情况③ ApplicationMasterAM—— 任务老大AM是单个应用的协调者每个应用独占一个AM职责详细说明向RM申请资源根据任务需求申请Container任务监控与容错监控MapTask/ReduceTask运行状态失败时重新申请资源任务调度决定任务在哪个Container上运行关键设计AM与任务同节点运行若AM挂了RM会检测到并重新分配资源启动新的AM。④ Container—— 资源抽象单元Container是YARN的资源抽象封装了某个节点上的多维度资源资源维度说明内存默认最小1G最大8GCPU虚拟核数默认最小1核最大4核磁盘本地磁盘空间网络网络带宽Container不是物理容器如Docker而是逻辑资源隔离单元由NM通过Cgroup等机制实现资源限制。三、YARN工作机制与作业提交流程3.1 完整流程图解3.2 十五步详细解析第一阶段作业提交第1-5步步骤操作说明①MR程序提交到客户端节点客户端调用job.waitForCompletion()②向RM申请ApplicationYarnRunner向RM请求新的应用ID③RM返回资源提交路径和作业ID路径如hdfs://.../.staging/application_xxx④提交资源到HDFS上传jar包、切片信息、job.xml配置文件⑤申请运行MRAppMaster资源提交完毕后向RM申请启动AM第二阶段作业初始化第6-9步步骤操作说明⑥RM将Job加入调度器根据调度策略放入对应队列⑦空闲NM领取Task某个NM通过心跳获取到任务⑧NM创建Container并启动AMAM在Container中运行⑨AM下载资源到本地从HDFS下载jar包和配置第三阶段任务分配第10-11步步骤操作说明⑩AM向RM申请MapTask资源根据切片数量申请对应Container⑪RM分配Container给NM选择资源充足的节点分配任务第四阶段任务运行第12-15步步骤操作说明⑫AM发送启动脚本NM启动MapTaskMapTask对数据分区排序⑬MapTask完成后AM申请ReduceTask资源等待所有MapTask结束⑭ReduceTask向MapTask拉取数据按分区获取中间结果⑮程序结束AM向RM申请注销释放所有资源3.3 进度与状态更新机制机制频率说明任务进度汇报实时任务将进度和Counter返回给AM客户端轮询每秒1次客户端向AM请求进度更新展示给用户作业完成检查每5秒客户端调用waitForCompletion()检查资源清理作业完成后AM和Container清理工作状态四、YARN三大调度器对比YARN支持三种调度器FIFO、Capacity Scheduler和Fair Scheduler。4.1 FIFO调度器先进先出特点单队列按提交顺序先来先服务简单易懂但不支持多用户共享生产环境几乎不用4.2 容量调度器Capacity SchedulerApache Hadoop 3.1.3默认调度器Yahoo开发。核心特性特性说明多队列支持默认只有default队列可配置多个容量保证每个队列配置资源容量百分比保证最低资源弹性分配空闲资源可分配给其他队列提高利用率ACL权限控制控制用户/组对队列的提交和管理权限优先级支持资源紧张时高优先级任务优先获取资源配置示例!-- capacity-scheduler.xml --propertynameyarn.scheduler.capacity.root.queues/namevaluedefault,hive/value/propertypropertynameyarn.scheduler.capacity.root.default.capacity/namevalue40/value/propertypropertynameyarn.scheduler.capacity.root.hive.capacity/namevalue60/value/property生产环境多队列设计思路设计维度示例按框架分hive队列、spark队列、flink队列按业务部门分登录注册队列、购物车队列、下单队列、支付队列按优先级分高优先级队列双十一核心交易、低优先级队列离线报表4.3 公平调度器Fair SchedulerCDH框架默认调度器Facebook开发。核心特性特性说明公平共享所有应用平均分配资源缺额大的优先获取支持抢占允许从超额队列回收资源默认关闭队列放置规则支持按用户、组、指定队列等多层规则自动分配最小资源保证每个队列可配置最小资源防止饿死公平调度器配置!-- yarn-site.xml --propertynameyarn.resourcemanager.scheduler.class/namevalueorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler/value/propertypropertynameyarn.scheduler.fair.allocation.file/namevalue/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml/value/property队列放置规则示例!-- fair-scheduler.xml --queuePlacementPolicy!-- 先匹配指定队列 --rulenamespecifiedcreatefalse/!-- 再按用户所属组匹配 --rulenamenestedUserQueuecreatetruerulenameprimaryGroupcreatefalse//rule!-- 最后拒绝或放入default --rulenamereject//queuePlacementPolicy4.4 三大调度器对比总结维度FIFOCapacity SchedulerFair Scheduler默认场景无Apache HadoopCDH队列支持单队列多队列多队列资源分配先来先服务容量百分比公平共享弹性扩展无空闲资源可借用支持抢占适用场景测试环境多用户共享、资源隔离多用户公平共享五、YARN生产环境核心参数调优5.1 参数配置案例场景3台服务器每台4G内存、4核CPU、4线程处理1G数据。计算分析1G数据 / 128M切片 8个MapTask1个ReduceTask 1个MRAppMaster共10个任务 / 3台 ≈ 每台3-4个任务5.2 核心参数详解ResourceManager参数!-- 调度器选择默认容量调度器 --propertynameyarn.resourcemanager.scheduler.class/namevalueorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler/value/property!-- RM处理调度器请求的线程数默认50 --propertynameyarn.resourcemanager.scheduler.client.thread-count/namevalue8/value/propertyNodeManager参数!-- NM使用内存默认8G根据实际调整 --propertynameyarn.nodemanager.resource.memory-mb/namevalue4096/value/property!-- NM使用CPU虚拟核数默认8 --propertynameyarn.nodemanager.resource.cpu-vcores/namevalue4/value/property!-- 是否自动检测硬件生产环境建议手动配置 --propertynameyarn.nodemanager.resource.detect-hardware-capabilities/namevaluefalse/value/propertyContainer资源限制参数!-- 容器最小内存默认1G --propertynameyarn.scheduler.minimum-allocation-mb/namevalue1024/value/property!-- 容器最大内存默认8G --propertynameyarn.scheduler.maximum-allocation-mb/namevalue2048/value/property!-- 容器最小CPU核数默认1 --propertynameyarn.scheduler.minimum-allocation-vcores/namevalue1/value/property!-- 容器最大CPU核数默认4 --propertynameyarn.scheduler.maximum-allocation-vcores/namevalue2/value/property虚拟内存参数!-- 虚拟内存检查默认打开建议关闭避免误杀 --propertynameyarn.nodemanager.vmem-check-enabled/namevaluefalse/value/property!-- 虚拟内存与物理内存比例默认2.1 --propertynameyarn.nodemanager.vmem-pmem-ratio/namevalue2.1/value/property5.3 参数调优黄金法则原则说明内存配置Container最大内存 ≤ NM总内存 / 同时运行Container数CPU配置Container最大vcores ≤ NM总vcores / 同时运行Container数虚拟内存若任务频繁被kill尝试关闭vmem-check或调大ratio异构集群硬件不一致时每台NM单独配置预留资源为系统进程和AM预留20%-30%资源六、YARN常用命令与实战6.1 应用管理命令# 列出所有Applicationyarnapplication-list# 按状态过滤yarnapplication-list-appStatesFINISHED# 查看应用详情yarnapplication-statusapplication_xxx# 终止应用yarnapplication-killapplication_xxx6.2 日志查看命令# 查看应用日志yarnlogs-applicationIdapplication_xxx# 查看指定Container日志yarnlogs-applicationIdapplication_xxx-containerIdcontainer_xxx6.3 节点与队列管理# 查看所有节点状态yarnnode-list-all# 刷新队列配置无需重启YARNyarnrmadmin-refreshQueues# 查看队列信息yarnqueue-statusdefault6.4 任务优先级实战# 提交时指定优先级需先开启优先级支持hadoop jar wordcount.jar-Dmapreduce.job.priority5/input /output# 动态修改运行中任务的优先级yarnapplication-appIDapplication_xxx-updatePriority5七、YARN Tool接口与动态传参7.1 问题背景直接运行hadoop jar wc.jar WordCountDriver -Dmapreduce.job.queuenameroot.test /input /output会报错因为-D参数被误认为是输入路径。7.2 Tool接口解决方案实现Tool接口通过ToolRunner解析参数publicclassWordCountimplementsTool{privateConfigurationconf;Overridepublicintrun(String[]args)throwsException{JobjobJob.getInstance(conf);// ... 作业配置FileInputFormat.setInputPaths(job,newPath(args[0]));FileOutputFormat.setOutputPath(job,newPath(args[1]));returnjob.waitForCompletion(true)?0:1;}OverridepublicvoidsetConf(Configurationconf){this.confconf;}OverridepublicConfigurationgetConf(){returnconf;}}// DriverpublicclassWordCountDriver{publicstaticvoidmain(String[]args)throwsException{ConfigurationconfnewConfiguration();TooltoolnewWordCount();// ToolRunner自动解析-D参数intrunToolRunner.run(conf,tool,args);System.exit(run);}}提交命令yarnjar YarnDemo.jar com.atguigu.yarn.WordCountDriver\wordcount-Dmapreduce.job.queuenameroot.test /input /output八、核心知识点总结主题核心要点YARN架构RM全局管理、NM单节点管理、AM任务协调、Container资源单元作业提交流程客户端提交→RM分配→NM启动AM→AM申请资源→启动任务→完成注销调度器选择FIFO简单但不实用Capacity多队列容量隔离Fair公平共享生产调优根据硬件配置NM资源、合理设置Container上下限、关闭虚拟内存检查动态传参实现Tool接口通过ToolRunner解析-D参数九、面试高频考点Q1YARN相比Hadoop 1.x的JobTracker有什么优势A解耦资源管理和作业调度RM只负责资源分配AM负责作业协调支持多计算框架MR/Spark/Flink共享集群资源。Q2ApplicationMaster挂了怎么办ARM通过心跳监控AM存活状态若AM挂了RM会重新分配资源启动新的AM新AM从HDFS恢复作业状态继续执行。Q3ReduceTask数量如何影响YARN资源分配AReduceTask数决定申请的Container数量过多会导致资源争抢过少则Reduce端压力大。一般设置为节点数的0.95或1.75倍。Q4容量调度器和公平调度器的核心区别A容量调度器以队列容量百分比分配资源强调资源隔离公平调度器以缺额大小分配资源强调公平共享支持抢占。