YARN介绍与实战
YARN 原理与实验讲义课程信息项目内容实验环境Hadoop 3.5.0 完全分布式集群1 主多从前置知识HDFS 基本操作hadoop fs命令、Linux 常用命令学习目标知识目标能说出 YARN 的定位与作用理解 Hadoop 1.0 与 2.0 在体系结构上的区别能准确描述 YARN 四大核心组件RM、NM、AM、Container的职责及协作关系能区分三种资源调度器FIFO、Capacity、Fair的工作原理与适用场景能说出 yarn-site.xml 中常用配置参数的含义与默认值。技能目标会启动、关闭 YARN 集群并通过jps命令验证进程状态会通过 Web UI8088/19888监控集群与作业会使用yarn application系列命令查询、筛选、终止作业能独立完成单词计数实验准备数据 → 上传 HDFS → 提交作业 → 查看结果。目录第一节 YARN 概述第二节 YARN 体系架构第三节 YARN 调度器第四节 YARN 常见配置yarn-site.xml第五节 YARN 常用命令第六节 实验案例单词计数附录A 常见问题排查附录B 术语表第一节 YARN 概述1.1 YARN 是什么Apache Hadoop YARNYet Another Resource Negotiator另一种资源协调者是 Hadoop 集群当中的资源管理系统模块。从 Hadoop 2.x 开始引入 YARN用来管理集群当中的资源主要是服务器的各种硬件资源包括CPU、内存以及运行在 YARN 上面的各种任务。总结成一句话YARN 主要就是为了资源管理、任务调度。在 Hadoop 1.0 时代MapReduce 既负责数据处理又负责集群资源管理两个职能耦合在一起其他计算框架无法共用集群资源。Hadoop 2.0 把资源管理职能从 MapReduce 中剥离出来交给 YARNMapReduce以及 Spark 等其他框架只负责数据处理全部运行在 YARN 之上。【本节知识点】YARN 全称 Yet Another Resource Negotiator是 Hadoop 的资源管理系统模块YARN 从 Hadoop 2.x 开始引入管理的资源主要是 CPU 和内存YARN 的两大核心职能资源管理任务调度引入 YARN 后MapReduce 只负责数据处理多种计算框架可共享集群资源。1.2 YARN 的启动与关闭YARN 的启停脚本位于 Hadoop 安装目录的sbin目录下。通常在 HDFS 已启动start-dfs.sh的基础上在主节点执行以下命令# 1. 定位到 hadoop 安装目录以实际安装路径为准 cd /usr/local/hadoop-3.5.0 # 2. 启动 YARN在主节点执行会远程拉起各从节点的 NodeManager ./sbin/start-yarn.sh # 3. 关闭 YARN ./sbin/stop-yarn.sh # 4. 启动历史日志服务查看已完成作业的日志 ./sbin/mr-jobhistory-daemon.sh start historyserver # 5. 启动 timeline 服务 ./sbin/yarn-daemon.sh start timelineserver启动完成后用jps命令验证进程。正常情况下应能看到ResourceManager主节点和NodeManager各从节点两个进程jps【操作要点】start-yarn.sh只需在主节点执行一次无需到每台从节点上分别启动jps看不到 NodeManager 时先检查从节点的yarn-site.xml配置与 SSH 免密登录JobHistoryServer 与 TimelineServer 是辅助服务不启动不影响作业提交但会影响历史日志查看。1.3 YARN 常用访问地址服务地址示例IP 以实际集群为准用途YARN 集群监控管理界面http://192.168.1.11:8088/cluster查看集群资源、节点、所有应用程序JobHistoryServer 查看界面http://192.168.1.11:19888/jobhistory查看已完成作业的详细历史日志在浏览器中打开 8088 端口的集群监控界面可以看到集群整体资源内存、CPU 核数、活跃节点数以及所有应用程序的列表与状态【本节知识点】8088ResourceManager Web UI作业运行期间和结束后都可访问19888JobHistoryServer Web UI专门查询已完成作业的历史日志两个端口的前提对应服务已启动且服务器防火墙已放行端口。1.4 YARN 帮助文档官方文档Apache Hadoop 3.5.0 – Apache Hadoop YARN本地文档在 hadoop-3.5.0 下载包内路径为/hadoop-3.5.0/share/doc/hadoop/hadoop-yarn/养成查官方文档的习惯调度器配置、参数含义等进阶内容都以官方文档为准。【上机操作 1】启动 YARN 并访问 Web UI约 10 分钟前置条件cd /usr/local/soft/hadoop-3.5.0/在主节点执行./sbin/start-yarn.sh启动 YARN执行jps确认出现ResourceManager进程到任一从节点执行jps确认出现NodeManager进程在浏览器打开http://主节点IP:8088/cluster记录页面上的Mem Total与VCoers Total即集群可用内存与虚拟核数执行./sbin/mr-jobhistory-daemon.sh start historyserver刷新 19888 端口页面确认可访问实验结束后如需释放资源执行./sbin/stop-yarn.sh关闭集群。第二节 YARN 体系架构2.1 总体架构YARN 的架构由ResourceManagerRM和NodeManagerNM组成RM 是全局的资源仲裁者NM 是各工作节点上的资源代理应用程序则以 Container 为资源单位运行在 NM 之上由 ApplicationMaster 负责协调。各组件职责一览组件所属层面核心职责ResourceManager全局主节点负责 Job 之间资源的协调和仲裁内含 Scheduler 与 ApplicationsManagerNodeManager单节点从节点负责 Container 的管理和主机资源的监控cpu、mem、disk、network并把 Container 和监控状态报告给 ResourceManagerApplicationMaster每个应用一个用户提交的 job负责向 RM 申请资源与 NM 交互执行和监控 jobContainer运行实例资源的分配单位封装任务运行所需的节点、内存、CPU 等资源【本节知识点】RM 又包括两个内部组件Scheduler调度器负责资源的管理和 JOB 的运行监控常用有FairScheduler和CapacitySchedulerApplicationsManager负责接收用户提交的 JOB协调启动第 1 个 AM 的 Container提供 AM 失败重启一个应用程序 1 个 ApplicationMaster N 个 Container。2.2 ResourceManager资源管理器ResourceManager 是 YARN 的大脑运行在主节点上负责 Job 之间资源的协调和仲裁。它主要承担四项职责处理客户端请求启动 / 监控 ApplicationMaster监控 NodeManager资源分配与调度。注意区分RM 负责整体资源的分配调度但不负责单个应用程序内部的任务执行——那是由每个应用自己的 ApplicationMaster 负责的。2.3 NodeManager节点管理器NodeManager 运行在每个从节点上负责单个节点上的资源管理和任务管理。主要职责包括接收并处理来自ResourceManager的命令接收并处理来自ApplicationMaster的命令管理抽象容器Container定时向 RM 汇报本节点资源使用情况和各个 Container 的运行状态。2.4 ApplicationMaster应用程序管理者当有新的任务提交到 ResourceManager的时候ResourceManager 会在某个从节点 NodeManager 上面启动一个 ApplicationMaster 进程。ApplicationMaster 的主要作用为应用程序申请资源任务执行的资源分配任务的生命周期监控。每个应用程序都有自己专属的 AMMapReduce 作业有 MRAppMasterSpark 作业有 Spark 的 AM。AM 与 RM 之间是申请—分配关系与 NM 之间是启动—运行 Container关系。2.5 Container容器Container 是 YARN 的资源分配单位。ApplicationMaster 启动之后与 ResourceManager 进行通信向 ResourceManager 提出资源申请的请求然后 ResourceManager 将资源分配给 ApplicationMaster——这些资源的表示就是一个个的 Container。Container 的主要作用封装任务运行资源节点、内存、CPU是对任务运行环境的抽象。【本节知识点】Container 一定量资源内存 CPU 核数 在某个节点上运行任务的环境抽象AM 自己也运行在第一个 Container 中由 ApplicationsManager 协调启动任务MapTask / ReduceTask都运行在 Container 里。2.6 JobHistoryServer作业历史服务这是 YARN 提供的一个查看已经完成的任务的历史日志记录的服务。启动 JobHistoryServer 后可以观察已经完成的任务的所有详细日志信息。访问界面http://服务器地址:19888/jobhistory2.7 TimelineServer时间线服务背景在 hadoop 2.4 版本之前对任务执行的监控只开发了针对 MR 的 Job History Server它可以提供给用户查询已经运行完成的作业的信息。但是后来随着在 YARN 上面集成的计算框架越来越多比如 Spark、Tez有必要为基于这些计算引擎的技术开发相应的作业任务监控工具。所以 hadoop 的开发人员就考虑开发一款更加通用的 Job History Server即 YARN Timeline用来监控所有运行在 yarn 平台上面的所有任务例如 MR、Storm、Spark、HBase 等等。主要职责收集并检索应用程序或者框架的相关信息。应用程序开发者可以在 AppMaster 端或者应用程序 containers 中通过 TimelineClient 将这些信息发送给 Timeline Server。这些信息都可以通过 REST APIs 在具体 App 或者执行框架的 UI 界面查询到。【本节知识点】JobHistoryServer 面向 MapReduce 作业TimelineServer 是更通用的历史信息服务可覆盖多种计算框架两者互补而非替代查 MR 历史日志用 19888跨框架的运行信息收集与检索用 TimelineServer。【本节思考题】客户端提交作业后RM、NM、AM、Container 分别发生了什么请按时间顺序描述一遍。RM 内部的 Scheduler 和 ApplicationsManager 各自负责什么JobHistoryServer 与 TimelineServer 的区别是什么为什么 2.4 版本之后要开发 TimelineServer第三节 YARN 调度器3.1 为什么需要调度器在 YARN 框架中调度器是一块很重要的内容。有了合适的调度规则就可以保证多个应用在同一时间有条不紊地工作。最原始的调度规则就是FIFO即按照用户提交任务的时间来决定哪个任务先执行。但这样很可能出现两个问题大任务独占资源一个大任务先提交占满集群其他任务只能不断等待饥饿starvation一堆小任务持续提交占满资源大任务一直无法得到适当的资源。所以 FIFO 虽然很简单但是并不能满足我们的需求。YARN 默认提供了另外两种常用的调度规则Capacity Scheduler与Fair Scheduler。3.2 FIFO Scheduler队列调度器FIFO Scheduler 把应用按提交的顺序排成一个队列这是一个先进先出队列。在进行资源分配的时候先给队列中最头上的应用分配资源待最头上的应用需求满足后再给下一个分配以此类推。FIFO Scheduler 是最简单也是最容易理解的调度器也不需要任何配置但它并不适用于共享集群——大的应用可能会占用所有集群资源这就导致其它应用被阻塞。在集群中更适合采用Capacity Scheduler或Fair Scheduler这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。3.3 Capacity Scheduler容量调度器Capacity Scheduler 是Apache 版本 Hadoop 默认使用的调度器。Capacity 调度器允许多租户共享整个集群每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列再为每个队列分配一定的集群资源整个集群就可以通过设置多个队列的方式给多个租户提供服务。除此之外队列内部又可以垂直划分这样一个组织内部的多个成员就可以共享这个队列资源了。在一个队列内部资源的调度采用的是先进先出FIFO策略。启用 Capacity Scheduler在yarn-site.xml中配置property nameyarn.resourcemanager.scheduler.class/name valueorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler/value /property更多配置请参考官方文档Apache Hadoop 3.5.0 – Hadoop: Capacity Scheduler3.4 Fair Scheduler公平调度器Fair Scheduler 是CDH 版本的 Hadoop 默认使用的调度器其设计目标是为所有的应用分配公平的资源对公平的定义可以通过参数来设置。公平调度也可以在多个队列间工作。举例假设有两个用户 A 和 B他们分别拥有一个队列——当 A 启动一个 job 而 B 没有任务时A 会获得全部集群资源当 B 启动一个 job 后A 的 job 会继续运行不过一会儿之后两个任务会各自获得一半的集群资源如果此时 B 再启动第二个 job则它会和 B 的第一个 job 共享 B 这个队列的资源——也就是 B 的两个 job 会分别使用四分之一的集群资源而 A 的 job 仍然占用集群一半的资源。结果就是资源最终在两个用户之间平等地共享。设计思想把资源CPU、MEM 等平均地分配到每个 application是一种基于时间的等额资源分配策略缺省是以MEM作为资源平均分配的策略。调度器把资源分隔为一个一个的 queue队列资源在这些 queue 中平均分配。一般来讲一个 application 只能归属到其中一个 queue当只有一个 application 运行时它会尽可能使用该 queue 的所有资源当有新的 application 提交时空闲出来的资源会分配给新的 application。这样每一个 application 都可以得到合理的资源。YARN 提供了一个缺省的 queue名字为default。启用 Fair Scheduler在yarn-site.xml中配置property nameyarn.resourcemanager.scheduler.class/name valueorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler/value /property更多配置请参考官方文档Apache Hadoop 3.5.0 – Hadoop: Fair Scheduler3.5 三种调度器对比对比维度FIFOCapacity SchedulerFair Scheduler资源分配方式按提交顺序先满足队头按队列划分队列预留容量按公平份额动态均衡适用场景单用户、简单批处理多组织多租户需要资源隔离多用户共享强调公平与快速响应是否需要配置不需要需要配置队列与容量需要配置队列与公平策略队列内部策略——FIFO公平共享默认发行版——Apache Hadoop 默认CDH Hadoop 默认【本节知识点】FIFO 的两大缺陷大任务独占资源阻塞他人、小任务挤压大任务造成饥饿Capacity队列隔离、容量预留队列内部 FIFOApache 默认Fair空闲资源即借即还、按份额均衡缺省按内存均衡CDH 默认三者都通过yarn.resourcemanager.scheduler.class参数启用配置后需重启 RM 生效。第四节 YARN 常见配置yarn-site.xmlYARN 的核心配置文件是yarn-site.xml位于$HADOOP_HOME/etc/hadoop/目录。常用参数如下参数默认值说明yarn.scheduler.minimum-allocation-mb1024给应用程序 container 分配的最小内存MByarn.scheduler.maximum-allocation-mb8192给应用程序 container 分配的最大内存MByarn.scheduler.minimum-allocation-vcores1每个 container 默认给分配的最小虚拟内核个数yarn.scheduler.maximum-allocation-vcores4每个 container 可以分配的最大虚拟内核个数yarn.nodemanager.resource.memory-mb8192NodeManager 可以分配的最大内存大小MBmapreduce.framework.namelocal需改为 yarn指定 MR 运行在yarn上yarn.nodemanager.aux-services——配置为mapreduce_shuffle指定节点可以运行 MapReduce 程序yarn.resourcemanager.hostname——指定 YARN 的 ResourceManager 的地址yarn.log-aggregation-enablefalse日志聚集功能应用运行完成以后将日志信息上传到 HDFS 系统上yarn.log-aggregation.retain-seconds6048007 天日志保留时间默认 7 天常用配置示例片段按集群实际情况修改configuration !-- 指定 ResourceManager 所在主机 -- property nameyarn.resourcemanager.hostname/name valuenode11/value /property !-- 指定 MR 运行在 yarn 上 -- property namemapreduce.framework.name/name valueyarn/value /property !-- 指定节点可以运行 mapreduce 程序shuffle 服务 -- property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property !-- 开启日志聚集 -- property nameyarn.log-aggregation-enable/name valuetrue/value /property /configuration【本节知识点】minimum/maximum-allocation-*四个参数决定了单个 Container 能申请到的资源上下限yarn.nodemanager.resource.memory-mb决定每个节点能贡献给 YARN 的总内存mapreduce.framework.nameyarn与aux-servicesmapreduce_shuffle两项不配MR 作业无法在 YARN 上运行修改配置后需要重启 YARN才能生效集群所有节点的配置应保持一致。第五节 YARN 常用命令YARN 对外提供yarn application子命令来管理应用程序基本语法yarn application [-options]功能命令说明列出所有应用yarn application -list列出所有 application 信息按状态筛选yarn application -list -appStates RUNNING与-list一起使用筛选不同状态的 application多个用,分隔按类型筛选yarn application -list -appTypes MAPREDUCE与-list一起使用筛选不同类型的 application多个用,分隔杀死应用yarn application -kill Application ID杀死一个 application需指定 Application ID查看应用状态yarn application -status Application ID列出某个 application 的状态所有状态ALL, NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED命令示例# 1. 列出所有 application yarn application -list # 2. 只看正在运行的任务 yarn application -list -appStates RUNNING # 3. 只看 MAPREDUCE 类型的任务 yarn application -list -appTypes MAPREDUCE # 4. 杀死一个 applicationApplication ID 从 -list 结果中获取 yarn application -kill application_1526100291229_206393 # 5. 查看某个 application 的状态 yarn application -status application_1526100291229_206393【上机操作 2】application 常用命令练习约 10 分钟执行yarn application -list观察当前集群的应用列表没有作业时列表为空属正常执行yarn application -list -appStates FINISHED观察已完成应用需先完成第六节实验再回来验证任选一个 Application ID执行yarn application -status ID抄录其 State 与 FinalStatus 字段选做提交一个运行时间较长的作业用-kill将其终止再到 8088 页面确认其状态变为 KILLED。第六节 实验案例单词计数6.1 实验目的掌握向 YARN 提交 MapReduce 作业的完整流程观察 YARN 为作业分配资源、运行 Container 的过程学会通过命令行和 Web UI 两种方式查看作业运行状态与结果。6.2 实验环境Hadoop 3.5.0 完全分布式集群YARN 已启动start-yarn.shHDFS 已启动start-dfs.sh示例程序使用 Hadoop 自带的hadoop-mapreduce-examples-3.5.0.jar中的 wordcount准备一个纯文本数据文件如nalan.txt。6.3 实验原理wordcount单词计数是 MapReduce 的经典入门程序Map 阶段把文本切分成单词并标记 1Reduce 阶段按单词汇总出现次数。作业提交到 YARN 后由 ResourceManager 协调启动 ApplicationMaster再由 AM 向 RM 申请 Container 运行 MapTask 与 ReduceTask——这正是第二节所学的组件协作过程。6.4 实验步骤Step 1将 Linux 本地文件上传到 HDFShadoop fs -put /usr/local/data/nalan.txt /nalan上传后可用hadoop fs -ls /nalan确认文件已存在。Step 2执行单词计数作业cd /usr/local/soft/hadoop-3.5.0/ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /nalan /usr命令含义运行 examples 包中的wordcount程序输入目录为 HDFS 上的/nalan输出目录为/usr。注意输出目录不能事先存在否则作业直接报错退出可换一个新目录或用hadoop fs -rm -r删除旧目录输入输出路径可按实际环境调整课程配套案例文件中使用的是wordcount /data/log /result。Step 3观察作业运行过程提交后终端会持续打印作业进度Running job、map/reduce 进度百分比运行结束后输出计数器Counters信息重点关注以下字段从计数器可以看到本次作业Launched map tasks1、Launched reduce tasks1Map input records1551、Reduce output records836等即 1551 行输入最终归并出 836 个单词。6.5 结果查看方式一YARN Web UI8088打开http://主节点IP:8088/cluster在All Applications列表中可以看到本次word count应用Application Type 为MAPREDUCEState 为FINISHEDFinalStatus 为SUCCEEDED点击 Application ID 进入应用详情页可查看启动时间、耗时、队列、AM 容器等信息方式二命令行查看 HDFS 输出结果# 查看输出目录 hadoop fs -ls /usr # 查看统计结果part-r-00000 为 reduce 输出文件 hadoop fs -cat /usr/part-r-00000每一行即单词 \t 出现次数。已开启日志聚集见第四节yarn.log-aggregation-enable参数时还可在 19888 JobHistory 页面点击 Logs 查看完整任务日志。6.6 实验验收与拓展练习验收标准全部满足为通过yarn application -list中可见本次 wordcount 作业状态 FINISHED / SUCCEEDEDWeb UI 8088 页面能看到该应用记录hadoop fs -cat /usr/part-r-00000能输出正确的单词统计结果能口头说出作业提交后 RM、AM、NM、Container 之间的协作过程。拓展练习换一个更大的文本文件重新运行对比两次作业的 Map/Reduce 计数器差异用yarn application -list -appTypes MAPREDUCE和-appStates组合筛选作业修改yarn.scheduler.maximum-allocation-mb后重启 YARN观察提交同一作业时 Container 分配资源的变化实验后记得改回将输出目录改为队列指定的路径如/result再完整跑一遍流程。附录A 常见问题排查现象可能原因解决方法执行start-yarn.sh后 8088 页面打不开ResourceManager 未启动成功防火墙未放行端口jps确认 RM 进程查看logs/yarn-*-resourcemanager-*.log放行 8088 端口主节点有 RM但从节点jps看不到 NodeManagerworkers 文件配置有误SSH 免密不通从节点配置不一致检查workersslaves文件逐台验证免密登录比对各节点yarn-site.xml作业一直处于 ACCEPTED 状态不运行集群可用资源不足无法满足 Container 最低申请量确认 NM 已注册8088 Nodes 页面检查yarn.nodemanager.resource.memory-mb与 minimum-allocation 参数是否匹配提交即报错输出目录已存在上一次运行的输出目录残留hadoop fs -rm -r /usr删除后重试或更换输出目录作业 FINISHED但 19888 页面查不到记录JobHistoryServer 未启动未开启日志聚集启动mr-jobhistory-daemon.sh start historyserver在 yarn-site.xml 开启yarn.log-aggregation-enable-kill后作业状态仍是 RUNNINGkill 请求已提交但 RM 尚未处理完成稍等数秒后用-status复查状态应变为 KILLED以上排查以教师提供的集群环境为准路径与端口请结合实际情况调整。附录B 术语表术语含义YARNYet Another Resource NegotiatorHadoop 的资源管理与任务调度系统ResourceManager (RM)全局资源管理器负责 Job 之间资源的协调和仲裁NodeManager (NM)单个节点上的资源与任务管理代理ApplicationMaster (AM)每个应用专属的管家负责申请资源、分配任务、监控生命周期ContainerYARN 的资源分配单位封装节点、内存、CPU 等任务运行资源SchedulerRM 内部的调度器组件常见有 CapacityScheduler 与 FairSchedulerFIFO先进先出调度按提交顺序分配资源Capacity Scheduler容量调度器按队列划分集群容量Apache 版默认Fair Scheduler公平调度器按公平份额动态分配资源CDH 版默认JobHistoryServer查看已完成 MR 作业历史日志的服务19888 端口TimelineServer通用的应用运行信息收集与检索服务支持多种计算框架wordcountMapReduce 经典示例程序统计文本中每个单词出现的次数