作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.YARN概述
HDFS是Hadoop两大基石之一,而YARN是另一个。如果HDFS是存储层,则YARN是Hadoop的处理层。简单地说,YARN是一个用于管理在网络中的多台计算机上执行的分布式应用程序的框架。YARN管理Hadoop集群中的所有资源。
需要注意的是,除了MapReduce v2外,YARN还支持其他分布式处理框架,如Imapala,Spark,Hbase,Flink和Giraph等。在Hadoop环境中运行的所有应用程序,包括MapReduce,Spark,Tez以及其他应用程序,都是用YARN执行它们的工作。
YARN是Hadoop的处理层,它包含资源管理器和作业调度程序。YARN使用多个处理框架可以在相同的Hadoop集群上运行,例如:
(1)批处理程序:
如Spark,MapReduce。
(2)交互式SQL:
如Impala。
(3)先进分析:
如Spark SQL,Spark ML和Impala。
(4)流式处理:
如Spark Streaming。
在深入研究YARN的复杂性之前,首先解释一下使用的术语。比如:"MapReduce 2.0","MRv2","YARN","Apache Hadoop NextGen MapReduce"这几个名称都是指相同的东西。
二.YARN的各组件架构介绍
1>.YARN架构概述
YARN依赖于一个集群范围的ResourceManager(简称"RM"),它是在Hadoop集群中运行的所有应用程序进行资源申请时的权威仲裁器。RM与在集群中的每个工作节点(DataNode)上运行的NodeManager(简称"NM")协同工作。单个RM和每个节点上的NM组成数据计算框架。
每个在YARN上运行的应用程序都是一个与之关联的ApplicationMaster(简称"AM")。AM主要用来与RM协商资源,并与NM一起执行作为每个应用程序一部分的任务。
在深入了解YARN的架构之前,需要了解一些相关术语。如下图所示,显示了YARN的高级架构,以及他的核心组件如何协同工作来处理数据。RM,AM和NM是执行计算工作的关键参与者。
客户端(Client):
是将YARN作业提交到集群的程序。有时一个客户端也特指客户机程序运行在其上的网关机器。
作业(Job):
也成为了应用程序(例如:MapReduce,Spark,Flink),以MapReduce为例,作业包括mappers,可选的reducer和它们处理的输入列表,每个MR作业可能包含一个或多个任务。
任务(Task):
我们依旧以MapReduce为例,当运行MapReduce作业时,任务可以是一个mapper或reducer。有些应用程序同时使用mapper和reducer,还有一些应用程序使用mapper而不使用reducer。
容器(Container):
容器是对特定资源(比如RAM,CPU,磁盘大小等)的抽象,目前YARN仅支持RAM和CPU两种类型,而kuberneters在这方面要比YARN强大(当然这对于它使用容器引擎(比如Docker)也有一定关系)。
资源管理器(ResourceManager,简称"RM"):
顾名思义,它是负责资源调度和管理的一个组件。比如监控接受NodeManager,ApplicationMaster的上报信息和心跳包信息等。
节点管理器(NodeManager,简称"NM"):
运行在每个DataNode上的NodeManager守护进程负责启动和管理容器,并将当前节点的状态信息上报个RM。
应用程序(ApplicationMaster,简称"AM"):
每个作业都有一个AM,AM是由RM创建的,它完成作业所需的容器的所有请求。容器是对特定资源(如RAM和CPU)的抽象。
温馨提示:
上述信息只是简单的概述,关于更详细的内容请继续往下阅读,并结合下面的架构图来进行理解。
2>.YARN通过各NM节点管理的容器(container)分配资源
YARN使用容器,容器是用于应用处理的表示特定数量的内存和其他资源(比如Vcore)的逻辑结构,例如,容器可以表示2GB内存和2个处理核心。容器可以是一组物理资源,如内存,CPU,磁盘和网络,现在只有内存和CPU可以用于容器调整。
所有YARN应用程序任务都运行在容器中。每个Hadoop作业包含多个任务,每个任务都运行在各自的容器中。当任务启动时,容器生效。当任务完成时,容器被杀死,其资源被分配给其他任务。
可以配置容器以满足和处理需求。同样,Hadoop也具有关于容器配置的默认值(例如"yarn.scheduler.minimum-allocation-mb"的默认值为1GB RAM,而"yarn.scheduler.maximum-allocation-mb"为8GB RAM)。
RM为每个应用程序分配容器。NM管理容器的生命周期,RM负责调度容器。每个YARN应用程序都运行在一个或多个容器中。
默认情况下,每个容器都有一定量的内存,也可以自定义内存大小。map和reduce容器通常使用的内存范围为1~4GB,但如果需要,也可以配置更多的内存。作为大数据运维工程师,实际上无法指定甚至预测作业的单个容器将在哪里运行,其完全由应用层进行管理。
如果一个作业被分配了800个容器,每个容器都执行一个如map或reduce的任务,这意味着容器将分布在集群节点之间,每个节点都有一堆容器。随着每个map或reduce任务的完成,容器将被终止。
如果有挂起的map或reduce任务,则将启动新的容器来重新运行作为应用程序一部分的挂起的任务。应用专用的ApplicationMaster在分配给各种节点的容器中启动作业。
任务数量以及可以在任何时候运行的YARN应用程序的数量受到集群能够分配的容器数量的限制。容器总数受分配给YARN的总内存量(即各个NM节点"yarn.nodemanager.resource.memory-mb"参数指定的总和)以及分配给YARN的处理器总数(受各NM节点"yarn.scheduler.minimum-allocation-mb"和"yarn.scheduler.maximum-allocation-mb"参数的影响)的限制。
3>.ResourceManager
每个YARN集群中都有一个ResourceManager角色,其主要执行三种工作,即"启动所有YARN应用","管理作业的调度与执行"和"基于所有NodeManager(其监管DataNode)之上分配资源"。
ResourceManager由两个关键组件Scheduler和ApplicationManager(注意哈,不要与之前专用于每个应用程序的ApplicationMaster混淆)组成。
Scheduler:
在容器和队列限制范围内为运行的应用程序分配资源。调度程序使用资源容器分配资源。
ApplicationsManager:
接受客户端提交的作业请求并启动第一个容器以执行新的ApplicationMaster。它也会在其失败时重新启动ApplicationMaster容器。
ResourceManager的关键功能如下所示:
(1)创建应用的第一个Container容器,该容器负责运行应用的ApplicationMaster;
(2)根据NodeManager发送的心跳信息管理DataNode;
(3)运行调度器来决定集群间的资源分配;
(4)管理集群的安全性;
(5)管理来自ApplicationMasters的资源请求;
(6)监控ApplicationMaster的状态,并在其发生故障时重新启动容器;
(7)在应用程序结束或过期后,解除分配的容器;
调度算法是ResourceManager的Schedule组件的一部分,其执行以下功能:
(1)让用户在预设策略的指导下以可预测的方式共享集群;
(2)实现多个用户负责的SLA协议;
(3)即使在资源密集,长时间运行的作业启动之后,仍可以在短时间内运行小型作业;
(4)减少不同大小的作业一起运行时的延迟(也就是我们常说的"任务推测执行"机制);
综上所述,ResourceManager在为集群中运行的应用程序分配集群资源,并在此过程中优化集群使用情况。
最重要的是要意识到ResourceManager是一个纯调度器,它不关心应用程序或框架的类型。它不了解MapReduce,Storm,Spark,Flink等的任何内容,它只需将资源分配给发出请求的应用程序,无论应用程序或框架的类型如何。
4>.NodeManager
在Hadoop 2.x版本中,集群中的每个DataNode运行一个NodeManager守护程序来执行YARN的功能(DataNode还运行一个DataNode守护进程来执行HDFS的功能)。每个节点上的NodeManager代理执行以下功能:
(1)通过健康心跳和容器的状态通知与全局ResourceManager进行通信;
(2)注册并启动应用进程;
(3)向ApplicationsManager请求启动ApplicationMaster的容器和剩下的应用程序资源容器(以MR为例,比如运行的map和reduce任务);
(4)监督应用程序容器的生命周期;
(5)监控,管理和提供容器消耗有关资源的信息(比如CPU,内存等);
(6)跟踪Datanodes的健康状态;
(7)健康容器的资源使用情况,并杀死失去控制的程序;
(8)通过聚合作业日志并将其保存到HDFS进行日志管理;
(9)提供针对YARN应用程序的辅助服务,辅助服务是为应用程序提供服务并由MapReduce框架用来进行其shuffle的排序操作的应用程序;
(10)维护节点级别的安全性;
5>.ApplicationMaster
每个YARN应用程序都有一个专用的ApplicationMaster(与作业相同)。ApplicationMaster的主要功能有两个,即"管理任务调度与执行"和"为应用的任务分配本地资源"。
与ResourceManager和NodeManager不同(它们都是持续运行的守护进程),ApplicationMaster它不是持续运行的守护进程(可以理解为执行某个应用程序而临时生成的守护程序),它对应一个应用程序,并为应用程序的运行申请资源。
尽管ResourceManager和NodeManager一直运行,ApplicationMaster也仅与运行的应用程序相关联,如果当前没有运行的的应用程序,则不会有ApplicationMaster进程存在。
记住,ApplicationMaster跟踪特定应用程序的作业进度。每次启动新应用程序时,ResourceManager会在集群的一个节点上部署一个容器来运行ApplicationMaster。
温馨提示:
在集群中运行的每个应用程序都与一个相应的ApplicationMaster相关联,该ApplicationMaster在应用程序启动时启动,并在该应用程序完成时终止。
ApplicationMaster负责管理应用程序的整个生命周期,从向ResourceManager请求必要的容器到向NodeManager提交这些容器的租约请求。
三.ApplicationMaster如何与ResourceManager协作进行资源分配
1>.ApplicationMaster的职责
与所有YARN进程一样,ApplicationMaster在YARN容器内运行。实际上他运行在应用程序启动时的第一个容器内。
一旦ApplicationMaster在应用程序的第一个容器中开始运行,它将与ResourceManager协商获取容器来执行应用中的mappers和reducers。之后会将ResourceManager分配的容器资源呈现给运行在每个DataNode上的NodeManager。
ApplicationMaster负责以资源容器的形式向ResourceManager请求资源以支持应用程序。它与运行在每个DataNode上的NodeManager服务协调工作以运行资源容器并监视如何使用分配给它们的资源。
ApplicationMaster的主要职责之一是提供资源容错,当ApplicationMaster向ResourceManager发出资源请求以运行其map和reduce任务时,请求是具体的。每个资源请求指定以下内容:
(1)处理作业所需的文件块;
(2)为应用程序创建的以容器为单位的资源量;
(3)容器的大小(例如,1GB内存和1个虚拟核心);
(4)资源在何处分配,是依据从NameNode获取的块存储位置信息而进行的(如机架1的节点"hadoop101.yinzhengjie.com"上分配4个容器,机架2的节点"hadoop203.yinzhengjie.com"上分配8个容器);
(5)资源请求的优先级(比如一个文件有多个块组成,如何按照块的顺序去数据等);
如果ApplicationMaster请求的资源可用,则ResourceManager满足ApplicationMaster的资源请求。然后ApplicationMaster给运行在DataNode上的NodeManager分配map和reduce任务容器。
温馨提示:
ApplicationMaster是一个特定的框架。例如,MRAppMaster是ApplicationMaster对于MapReduce应用程序的名称。对于Spark,是SparkAppMaster。
2>.JobHistoryServer
完整集群中都有一个JobHistoryServer服务。JobHistoryServer归档YARN素有的作业指标及元数据,并通过JobHistoryServer Web UI公开展示。
没有JobHistoryServer,集群也能良好的运行,但我们将无法轻松访问作业日志和作业历史记录。
3>.YARN的组件如何一起协同工作
ResourceManager,NodeManager和ApplicationMaster协同工作,为应用程序的资源请求提供服务。上图显示了基本的YARN架构,同时也显示了它们是如何协同工作的。
以下是YARN集群中MapReduce应用程序启动时发生的事件序列:
(1)客户端向ResourceManager提交MapReduce v2(简称"MRv2")应用程序请求,如下所示:
[root@hadoop101.yinzhengjie.com ~]# hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar wordcount /input /output
具体案例可参考我的笔记:
(官方自带的MR应用程序的jar包)https://www.cnblogs.com/yinzhengjie2020/p/12516593.html
(自定义MR应用程序的jar包)https://www.cnblogs.com/yinzhengjie/p/13174616.html
(2)ResourceManager的ApplicationManager组件指示NodeManager为应用程序启动一个新的ApplicationMaster实例。这是该应用程序的第一个(即0号)容器。运行mapper和reducer的容器会在之后被创建,把那个被命名为1,2,3,...等;
需要注意的是,这里的NodeManager是运行在每个工作节点中的其中一个,相对而言,ResourceManager会根据内部特定算法来指定一台相对来说不繁忙的NodeManager机器。
(3)ApplicationMaster通过向ResourceManager注册来初始化自身;
(4)ApplicationMaster计算完成应用程序所需的资源。ApplicationMaster基于对输入数据的切分确定应该启动map任务的数量。
需要注意的是,Application通过请求应用程序所需的输入文件名称和数据块的位置来计算输入切分的数量。利用这些信息,ApplicationMaster计算处理输入数据所需的map任务数量。
(5)ApplicationMaster请求ResourceManager为map任务分配必要的容器。其在应用程序的整个生命周期内与ResourceManager保持联系,确保其所需资源的列表被ResourceManager遵守,并且发送一些必要kill请求杀死任务。
(6)ResourceManager的Scheduler组件决定map任务在哪个节点运行。做出这个决定的关键因素包括数据位置和支持创建执行任务的新容器的节点的可用内存。
需要注意的是,ResourceManager将ApplicationMaster的资源请求放入队列中,并在节点中有可用资源时在特定节点为容器授予租赁权。
(7)ApplicationMaster指示NodeManager在已分配容器的节点上创建容器;
(8)NodeManager创建请求的容器,并启动它们。容器发送MapReduce的运行状态给ApplicationMaster。
需要注意的是,每个作业只有一个ApplicationMaster。
(9)ApplicationMaster为reducer任务向ResourceManager申请资源。
需要注意的是,如果MapReduce应用程序包含reducer的话,就需要执行该步骤,若没有reducer程序的话就不需要执行该步骤。
(10)ApplicationMaster请求ResourceManager为reduce任务分配资源的节点上启动reduce任务。
(11)reduce任务对mapper的中间数据进行shuffle和排序操作,并将输出写入HDFS(就是第一步骤指定的"/output",该目录不能提前存在,否则MR任务会运行失败哟)目录中。
(12)NodeManager将状态和健康状况报告到ResourceManager。一旦所有任务完成,ApplicationMaster会将结果发送给客户端应用程序,并将作业信息和日志发送到JobHistoryServer(前提是你在yarn-site.xml配置文件中启用了日志聚合功能)。
需要注意的是,该步骤会有任务容器清理其状态,并将中间输出从本地文件系统中删除。
(13)一旦应用程序完成运行,ApplicationMaster会通知ResourceManager该作业已成功完成,并将自身从ResourceManager中注销并关闭。
(14)ResourceManager释放应用程序持有的所有资源(容器)以集群复用。
温馨提示:
MapReduce作业通常涉及map和reduce阶段。如果节点上的map任务在运行MapReduce作业时挂起,则ApplicationMaster最终会将map任务尝试标记为失败,并请求NodeManager终止map任务的容器。