一、YARN 是什么?编程
从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制须要大规模的调整来修复它在可扩展性,内存消耗,线程模型,可靠性和性能上的缺陷。在过去的几年中,hadoop 开发团队作了一些 bug 的修复,可是这些修复的成本愈来愈高,这代表对原框架作出改变的难度愈来愈大。为从根本上解决旧MapReduce框架的性能瓶颈,促进 Hadoop 框架的更长远发展,从 0.23.0 版本开始,Hadoop 的 MapReduce 框架彻底重构,发生了根本的变化。新的 Hadoop MapReduce 框架命名为 MapReduceV2 或者叫 Yarn。缓存
YARN是从0.23.0版本开始新引入的资源管理系统,直接从MR1(0.20.x、0.21.x、0.22.x)演化而来,其核心思想:安全
将MR1中JobTracker的资源管理和做业调用两个功能分开,分别由ResourceManager和ApplicationMaster进程来实现服务器
1)ResourceManager:负责整个集群的资源管理和调度网络
2)ApplicationMaster:负责应用程序相关事务,好比任务调度、任务监控和容错等架构
二、为何要使用 YARN?框架
与旧 MapReduce 相比,YARN 采用了一种分层的集群框架,它解决了旧MapReduce 一系列的缺陷,具备如下几种优点。机器学习
1. 提出了HDFS Federation,它让多个NameNode分管不一样的目录进而实现访问隔离和横向扩展。对于运行中NameNode的单点故障,经过 NameNode热备方案(NameNode HA)实现分布式
2. YARN经过将资源管理和应用程序管理两部分分剥离开,分别由ResouceManager和ApplicationMaster负责,其中,ResouceManager专管资源管理和调度,而ApplicationMaster则负责与具体应用程序相关的任务切分、任务调度和容错等,每一个应用程序对应一个ApplicationMasteroop
3. YARN具备向后兼容性,用户在MRv1上运行的做业,无需任何修改便可运行在YARN之上。
4. 对于资源的表示之内存为单位 (在目前版本的Yarn中,没有考虑 cpu 的占用 ),比以前以剩余 slot 数目更合理。
5. 支持多个框架, YARN再也不是一个单纯的计算框架,而是一个框架管理器,用户能够将各类各样的计算框架移植到YARN之上,由YARN进行统一管理和资源分配。目前能够支持多种计算框架运行在YARN上面,好比MapReduce、Storm、Spark、Flink等
6. 框架升级更容易, 在YARN中,各类计算框架再也不是做为一个服务部署到集群的各个节点上(好比MapReduce框架,再也不须要部署JobTracler、 TaskTracker等服务),而是被封装成一个用户程序库(lib)存放在客户端,当须要对计算框架进行升级时,只需升级用户程序库便可,多么容易!
三、YARN 架构由什么组成?
首先咱们来看看 YARN 的架构图,以下图所示。
从 YARN 的架构图来看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等如下几个组件构成。
一、 ResourceManager(RM)
YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 ApplicationMaster 一块儿分配资源,与 NodeManager 一块儿启动和监视它们的基础应用程序。在此上下文中,ApplicationMaster 承担了之前的 TaskTracker 的一些角色,ResourceManager 承担了 JobTracker 的角色。
总的来讲,RM有如下做用
1)处理客户端请求
2)启动或监控ApplicationMaster
3)监控NodeManager
4)资源的分配与调度
二、 ApplicationMaster(AM)
ApplicationMaster 管理在YARN内运行的每一个应用程序实例。ApplicationMaster 负责协调来自 ResourceManager 的资源,并经过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。请注意,尽管目前的资源更加传统(CPU 核心、内存),但将来会带来基于手头任务的新资源类型(好比图形处理单元或专用处理设备)。从 YARN 角度讲,ApplicationMaster 是用户代码,所以存在潜在的安全问题。YARN 假设 ApplicationMaster 存在错误或者甚至是恶意的,所以将它们看成无特权的代码对待。
总的来讲,AM有如下做用
1)负责数据的切分
2)为应用程序申请资源并分配给内部的任务
3)任务的监控与容错
三、 NodeManager(NM)
NodeManager管理YARN集群中的每一个节点。NodeManager 提供针对集群中每一个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1 经过插槽管理 Map 和 Reduce 任务的执行,而 NodeManager 管理抽象容器,这些容器表明着可供一个特定应用程序使用的针对每一个节点的资源。
总的来讲,NM有如下做用
1)管理单个节点上的资源
2)处理来自ResourceManager的命令
3)处理来自ApplicationMaster的命令
四、 Container
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源即是用Container表示的。YARN会为每一个任务分配一个Container,且该任务只能使用该Container中描述的资源。
总的来讲,Container有如下做用
1)对任务运行环境进行抽象,封装CPU、内存等多维度的资源以及环境变量、启动命令等任务运行相关的信息
要使用一个 YARN 集群,首先须要一个包含应用程序的客户的请求。ResourceManager 协商一个容器的必要资源,启动一个 ApplicationMaster 来表示已提交的应用程序。经过使用一个资源请求协议,ApplicationMaster 协商每一个节点上供应用程序使用的资源容器。执行应用程序时,ApplicationMaster 监视容器直到完成。当应用程序完成时,ApplicationMaster 从 ResourceManager 注销其容器,执行周期就完成了。
经过上面的讲解,应该明确的一点是,旧的 Hadoop 架构受到了 JobTracker 的高度约束,JobTracker 负责整个集群的资源管理和做业调度。新的 YARN 架构打破了这种模型,容许一个新 ResourceManager 管理跨应用程序的资源使用,ApplicationMaster 负责管理做业的执行。这一更改消除了一处瓶颈,还改善了将 Hadoop 集群扩展到比之前大得多的配置的能力。此外,不一样于传统的 MapReduce,YARN 容许使用MPI( Message Passing Interface) 等标准通讯模式,同时执行各类不一样的编程模型,包括图形处理、迭代式处理、机器学习和通常集群计算。
四、YARN的原理
YARN 的做业运行,主要由如下几个步骤组成
1. 做业提交
client 调用job.waitForCompletion方法,向整个集群提交MapReduce做业 (第1步) 。 新的做业ID(应用ID)由资源管理器分配(第2步). 做业的client核实做业的输出, 计算输入的split, 将做业的资源(包括Jar包, 配置文件, split信息)拷贝给HDFS(第3步). 最后, 经过调用资源管理器的submitApplication()来提交做业(第4步).
2. 做业初始化
当资源管理器收到submitApplciation()的请求时, 就将该请求发给调度器(scheduler), 调度器分配container, 而后资源管理器在该container内启动应用管理器进程, 由节点管理器监控(第5步).
MapReduce做业的应用管理器是一个主类为MRAppMaster的Java应用. 其经过创造一些bookkeeping对象来监控做业的进度, 获得任务的进度和完成报告(第6步). 而后其经过分布式文件系统获得由客户端计算好的输入split(第7步). 而后为每一个输入split建立一个map任务, 根据mapreduce.job.reduces建立reduce任务对象.
3. 任务分配
若是做业很小, 应用管理器会选择在其本身的JVM中运行任务。
若是不是小做业, 那么应用管理器向资源管理器请求container来运行全部的map和reduce任务(第8步). 这些请求是经过心跳来传输的, 包括每一个map任务的数据位置, 好比存放输入split的主机名和机架(rack). 调度器利用这些信息来调度任务, 尽可能将任务分配给存储数据的节点, 或者分配给和存放输入split的节点相同机架的节点.
4. 任务运行
当一个任务由资源管理器的调度器分配给一个container后, 应用管理器经过联系节点管理器来启动container(第9步). 任务由一个主类为YarnChild的Java应用执行. 在运行任务以前首先本地化任务须要的资源, 好比做业配置, JAR文件, 以及分布式缓存的全部文件(第10步). 最后, 运行map或reduce任务(第11步).
YarnChild运行在一个专用的JVM中, 可是YARN不支持JVM重用.
5. 进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(经过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展现给用户。
6. 做业完成
除了向应用管理器请求做业进度外, 客户端每5分钟都会经过调用waitForCompletion()来检查做业是否完成. 时间间隔能够经过mapreduce.client.completion.pollinterval来设置. 做业完成以后, 应用管理器和container会清理工做状态, OutputCommiter的做业清理方法也会被调用. 做业的信息会被做业历史服务器存储以备以后用户核查.
若是,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
若是,您但愿更容易地发现个人新博客,不妨点击一下左下角的【关注我】。
若是,您对个人博客所讲述的内容有兴趣,请继续关注个人后续博客,我是【刘超★ljc】。
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。