当前位置: 首页 > 科技观察

专访-深入理解Yarn内部架构

时间:2023-03-19 01:31:16 科技观察

本文转载自微信公众号《大数据技术与数据仓库》,作者西贝。转载本文请联系大数据技术与数据仓库公众号。简介ApacheYARN(YetAnotherResourceNegotiator)是Hadoop的集群资源管理器。Yarn是在Hadoop2.x中引入的。Yarn允许图形处理、交互处理、流处理、批处理等不同的数据处理引擎运行和处理存储在HDFS(Hadoop分布式文件系统)中的数据。实际上,YARN不仅负责资源分配,还负责作业调度。MapReduce1.0不仅是一个计算框架,更是一个资源管理和调度框架。Hadoop2.0之后,MapReduce1.0中的资源管理和调度功能被单独分离出来,形成了YARN,是一个纯粹的资源管理和调度框架,而不是一个计算框架。剥离了资源管理和调度功能的MapReduce框架成为MapReduce2.0,是一个运行在YARN上的纯计算框架。它不再负责资源调度和管理服务,而是由YARN为其提供资源管理。调度服务。如下图所示:目前主流的大数据计算框架都可以运行在YARN上。YARNYARN的架构总体上还是Master/Slave结构。在整个资源管理框架中,ResourceManager是Master,NodeManager是Slave,ResourceManager负责各个NodeManager上资源的统一管理和调度。当用户提交一个应用程序时,需要提供一个ApplicationMaster来跟踪和管理该程序,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster分布在不同的节点上,不会相互影响。ResourceManager是一个纯粹的调度器,负责集群中可用资源的分配和管理。Scheduler调度器应用管理器(ApplicationsManager)NodeManager负责节点本地资源的管理,包括启动应用的Container,监控它们的资源使用情况,并向RMApplicationMaster具体框架库的一个实例上报,并且是负责RM协商资源,配合NM执行和监控Container及其资源消耗。AM也作为容器运行。ResourceManagerResourceManager(RM)是全局资源管理器,负责整个系统的资源管理和分配。它主要包括两个组件,调度器和应用程序管理器。调度器接收来自ApplicationMaster的应用资源请求,将集群中的资源以“容器”的形式分配给应用程序。容器的选择通常会考虑到应用程序要处理的数据所在的位置,选择距离最近的容器,从而实现“计算向数据靠拢”。容器是一个动态的资源分配单元,每个容器封装一定量的CPU、内存、磁盘等资源,从而限制每个应用程序可以使用的资源量。调度程序被设计为可插入组件。YARN不仅提供了多种直接可用的调度器,还允许用户根据自己的需要重新设计调度器。应用管理器(ApplicationsManager)负责系统中所有应用的管理,主要包括应用提交、与调度器协商资源启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重启等。NodeManagerNodeManager是驻留在YARN集群中各个节点上的代理,主要负责:容器生命周期管理监控资源(CPU、内存等)维护通信,将作业资源使用情况和各容器的运行状态上报给ResourceManager接收各种来自ApplicationMaster的requeststostart/stopcontainers需要注意的是,NodeManager主要负责管理抽象容器,只处理容器相关的事情。它并不具体负责管理各个任务(Map任务或Reduce任务)的状态,因为这些管理任务都是由ApplicationMaster来完成的,ApplicationMaster会不断地与NodeManager通信,掌握各个任务的执行状态。ApplicationMasterResourceManager接收到用户提交的作业,根据作业的上下文信息和NodeManager收集到的容器状态信息启动调度进程,为用户作业启动一个ApplicationMaster。ApplicationMaster的主要功能是:当用户作业提交时,ApplicationMaster与ResourceManager协商获取资源,ResourceManager以容器的形式为ApplicationMaster分配资源;进一步将获得的资源分配给内部任务(Map任务或Reduce任务),实现资源的“二次分配”;与NodeManager保持交互通信,启动、运行、监控和停止应用程序,监控所申请资源的使用情况,监控所有任务的执行进度和状态,并在任务发生时执行故障恢复(即重新申请资源到重启任务);定时向ResourceManager发送“心跳”消息,报告资源使用情况和申请进度信息;当作业完成后,ApplicationMaster会退出容器到ResourceManager,执行周期结束。YARN工作流程的简单流程图如下:1.作业提交JobSubmitter实现的作业提交过程执行以下操作:向资源管理器请求一个新的应用程序ID以用于MapReduce作业ID(步骤2)。检查作业的输出规范。例如,如果没有指定输出目录或已经存在,则不会提交作业并向MapReduce程序抛出错误。计算作业的输入分片。如果无法计算分片(例如,因为输入路径不存在),则不会提交作业,并向MapReduce程序抛出错误。将运行作业所需的资源(包括作业JAR文件、配置文件和计算输入切片)复制到HDFS共享文件系统中以作业ID命名的目录中(步骤3)。作业JAR被复制成多个副本,以便节点管理器在为作业运行任务时可以访问集群中的大量副本。通过在资源管理器上调用submitApplication()来提交作业(第4步)。2.作业初始化当资源管理器收到对其submitApplication()方法的调用时,它会将请求交给YARN调度程序。调度器分配一个容器,资源管理器启动appmaster。MapReduce作业的appmaster是一个Java应用程序,它初始化作业并跟踪任务的完成进度(第6步)。接下来,它从共享文件系统中检索在客户端计算的输入分片(步骤7)。然后它为每个拆分创建一个map任务和一些reduce任务。appmaster决定如何运行构成MapReduce作业的任务。如果作业很小,appmaster可能会选择在与自己相同的JVM中运行该任务。任务分配如果作业不符合在与应用程序主机相同的JVM中运行的条件,则应用程序主机从资源管理器请求容器用于作业中的所有映射和减少任务(步骤8)。对map任务的请求首先发出,并且比reduce任务具有更高的优先级,因为所有map任务必须在reduce的排序阶段开始之前完成。在完成5%的map任务之前,不会请求reduce任务。Reduce任务可以在集群中的任何地方运行,但是map任务有数据局部性限制。在最好的情况下,任务是数据本地的,即在与分片相同的节点上运行。或者,任务可以是机架本地的:与分片在同一个机架上,但不在同一个节点上。有些任务既不在同一个节点上,也不在同一个机架上,而是需要从不同机架的不同节点检索数据。该请求还指定了任务的内存和CPU要求。默认情况下,每个map和reduce任务都分配有1024MB内存和一个虚拟核心。任务执行一旦资源管理器的调度程序为特定节点上的容器分配了资源,应用程序主机将通过联系节点管理器启动容器(步骤9a和9b)。最后,它运行map或reduce任务(第11步)。作业完成当appmaster收到作业的最后一个任务已完成的通知时,它将作业的状态更改为“成功”。然后,当Job轮询状态时,它知道作业成功完成,打印一条消息告诉用户,并从waitForCompletion()方法返回。此时作业统计信息和计数器被打印到控制台。最后,在作业完成时,appmaster和任务容器清理它们的作业状态(删除中间输出)。作业信息由作业历史服务器存档,以便用户以后需要时查询。总结Hadoop生态是业界应用最广泛的大数据生态。YARN作为Hadoop生态系统的重要成员,在开源大数据领域扮演着重要的角色。许多计算框架都可以在YARN上运行,例如Spark、Flink和Storm。对于大多数公司的大数据计算场景,使用YARN来管理集群是一种比较常见的方案。