YARN(Hadoop操作系统)的架构

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文详细解释了YARN(Hadoop操作系统)的架构,包括其主要组件如ResourceManager、NodeManager和ApplicationMaster的作用以及它们如何协同工作来管理Hadoop集群中的资源和调度作业。

作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.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任务的容器。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
2月前
|
存储 安全 物联网
操作系统的心脏:深入理解现代操作系统架构与核心技术
本文旨在为读者提供一个关于现代操作系统(OS)架构和核心技术的全面概述。通过分析OS的主要组件、功能以及它们如何协同工作,本文揭示了操作系统在计算机系统中的核心地位及其复杂性。我们将探讨进程管理、内存管理、文件系统和输入/输出(I/O)等关键技术,并讨论它们对系统性能的影响。此外,本文还将涵盖一些最新的操作系统趋势和技术,如云计算、虚拟化和物联网(IoT)。通过阅读本文,读者将获得对操作系统内部运作方式的深刻理解,这对于软件开发人员、IT专业人士以及对计算机科学感兴趣的任何人来说都是宝贵的知识。
|
2月前
|
安全 调度 开发者
探索操作系统的心脏:现代内核架构与挑战
【10月更文挑战第7天】 本文深入探讨了现代操作系统内核的复杂性和功能性,从微观角度剖析了内核在系统运行中的核心作用及其面临的主要技术挑战。通过浅显易懂的语言解释专业概念,旨在为读者提供一个关于操作系统内核的全面视角。
49 2
|
3月前
|
算法 安全 Linux
操作系统的心脏:深入理解现代操作系统架构
本文旨在探讨现代操作系统的核心概念、架构以及关键技术。我们将从操作系统的基本定义开始,逐步解析其功能模块,包括进程管理、内存管理和文件系统等,最后讨论操作系统在现实世界中的应用和未来发展趋势。通过深入浅出的方式,帮助读者全面理解操作系统的工作原理及其重要性。
80 1
|
2月前
|
存储 人工智能 物联网
探索现代操作系统的架构与演进
【10月更文挑战第5天】 本文旨在深入探讨现代操作系统的核心架构及其在技术演进中的变革。通过对操作系统的基本概念、关键组成部分以及它们如何相互协作的分析,为读者提供一个全面且易于理解的视角。同时,本文还将回顾操作系统从单任务到多任务、从单用户到多用户的发展过程,并展望未来可能的技术趋势。
|
27天前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
1月前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
59 2
|
2月前
|
存储 资源调度 算法
操作系统的心脏:深入理解内核架构与机制####
【10月更文挑战第16天】 本文旨在揭开操作系统最神秘的面纱——内核,通过剖析其架构设计与关键机制,引领读者一窥究竟。在这篇探索之旅中,我们将深入浅出地讨论内核的基本构成、进程管理的智慧、内存分配的策略,以及那至关重要的系统调用接口,揭示它们是如何协同工作,支撑起现代计算机系统的高效运行。这既是一次技术的深潜,也是对“看不见的手”调控数字世界的深刻理解。 ####
54 3
|
2月前
|
存储 算法 安全
操作系统的心脏:深入理解现代操作系统架构与调度机制
本文将探讨现代操作系统的核心概念,包括进程管理、内存管理和 I/O 系统。通过分析这些组件如何协作以提供稳定和高效的计算环境,帮助读者更好地理解操作系统在现代计算中的重要性。我们将从宏观角度出发,逐步深入到微观细节,为读者提供全面而详细的技术解析。
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
85 3