YARN调度原理详解

server/2024/10/18 7:59:08/

        YARN(Yet Another Resource Negotiator)是 Hadoop 集群的资源管理和作业调度框架,它的设计旨在更好地管理和调度 Hadoop 集群中的资源。YARN 解决了传统 Hadoop MapReduce 中资源管理与作业调度紧耦合的问题,使得不同类型的计算任务可以在 Hadoop 集群上共存并高效地利用资源。

YARN 的架构和工作机制

YARN 的架构设计本质上是一个 资源分配和调度系统,它管理集群中的所有计算资源,并且为每个应用程序动态分配资源,同时保证容错性。YARN 主要由以下几个核心组件组成:

  1. ResourceManager(资源管理器)
    ResourceManager 是 YARN 中的全局资源调度器,是 YARN 的中央组件,它负责集群中所有节点的资源分配和管理。它的主要功能包括:

    • 资源管理:负责全局资源的监控和分配,决定将资源分配给哪个应用程序。
    • 作业调度:决定哪个任务可以使用哪些资源,并根据不同的调度算法(如 FIFO、Capacity Scheduler、Fair Scheduler)分配资源。

    ResourceManager 中的两个重要子组件:
        (1)Scheduler(调度器):负责根据调度策略将资源分配给各个应用程序,但不负责监控应用程序的状态。
        (2)ApplicationManager:负责接受来自客户端的作业请求,启动并监控应用程序 Master(ApplicationMaster)。
     

    源代码解析
            Scheduler 子系统:Scheduler 是 ResourceManager 中的一个子组件,用于资源分配和调度。YARN 中的 CapacityScheduler 和 FairScheduler 都继承了 YarnScheduler 接口,实现了具体的调度逻辑。
    public abstract class YarnScheduler {// 根据请求的资源 (ResourceRequest) 分配资源public abstract Allocation allocate(ApplicationAttemptId applicationAttemptId,List<ResourceRequest> ask, List<ContainerId> release,List<String> blacklistAdditions, List<String> blacklistRemovals);
    }
    
  2. NodeManager(节点管理器)
    NodeManager 是 YARN 中的工作节点管理组件,是运行在每个集群节点上的本地资源监控器。它的职责是:
    (1)资源报告:定期向 ResourceManager 汇报节点的资源使用情况和可用资源。
    (2)容器管理:NodeManager 负责启动和监控该节点上的容器(Container),并报告容器的状态(包括运行的任务)。
    (3)任务执行:当收到 ResourceManager 的指示后,NodeManager 负责启动一个容器来执行指定任务。

    源代码解析

    public class NodeManager extends CompositeService {// 启动 NodeStatusUpdater 线程protected void serviceStart() throws Exception {super.serviceStart();this.nodeStatusUpdater = createNodeStatusUpdater(context, dispatcher, metrics);this.nodeStatusUpdater.init(getConfig());this.nodeStatusUpdater.start();}
    }
    

  3. ApplicationMaster
    ApplicationMaster 是为每个应用程序专门启动的组件,它是应用程序的控制中心。它的主要任务包括:

    (1)协调资源:与 ResourceManager 通信,申请资源以运行作业中的各个任务。
    (2)任务调度与监控:将获得的资源分配给应用中的不同任务,并监控任务的执行状态。
    (3)故障恢复:在任务失败时,ApplicationMaster 负责重试或调度新的任务实例。

    源代码解析
    public class ApplicationMaster {// 向 ResourceManager 请求资源AllocateResponse allocate(List<ResourceRequest> resourceRequests, List<ContainerId> releaseContainers) {AllocateRequest allocateRequest = AllocateRequest.newInstance(this.responseId, progress, resourceRequests, releaseContainers, null);AllocateResponse response = resourceManager.allocate(allocateRequest);return response;}
    }
    

     
  4. Container(容器)
    容器是 YARN 分配给应用程序的一定量的资源单元。它包括了 CPU、内存、磁盘和网络等资源。一个任务将在容器内运行。NodeManager 负责启动和管理这些容器。

YARN 工作流程

当用户提交一个作业时,YARN 的工作流程如下:

  1. 作业提交

    (1)客户端向 ResourceManager 提交应用程序。
    (2)ResourceManager 会生成一个 ApplicationID,并在某个 NodeManager 上启动一个 ApplicationMaster 的容器负责调度作业中的任务。
     
    ApplicationId appId = appSubmissionContext.getApplicationId();
    resourceManager.submitApplication(appSubmissionContext);
    

  2. 资源请求

    ApplicationMaster 启动后,会向 ResourceManager 请求资源(通常是多个容器)来执行应用程序的任务。
     
  3. 资源分配

    (1)ResourceManager 根据当前的资源状况和调度策略(FIFO、容量调度、公平调度等)为 ApplicationMaster 分配资源。
    (2)ResourceManager 将分配好的资源信息发送给 ApplicationMaster。
    AllocateResponse response = scheduler.allocate(applicationAttemptId, ask, release, blacklistAdditions, blacklistRemovals);
    
  4. 任务执行

    • ApplicationMaster 根据分配到的资源,向 NodeManager 发送启动容器的请求。
    • NodeManager 启动容器后,ApplicationMaster 会调度任务在这些容器中运行。
  5. 监控与处理失败

    • ApplicationMaster 监控任务的执行进度。如果某个任务执行失败,它可以重新申请资源并重试该任务。
    • NodeManager 也会监控容器的运行状态,并报告给 ApplicationMaster 和 ResourceManager。
  6. 任务完成

    • 当所有任务执行完毕后,ApplicationMaster 会向 ResourceManager 汇报应用程序的完成情况。
    • ResourceManager 释放该应用程序的所有资源,ApplicationMaster 也会终止。

YARN 的优势

  • 资源分离:YARN 将资源管理和作业调度分离,使得 Hadoop 不仅能运行 MapReduce,还可以运行其他分布式计算框架(如 Spark、Tez、Flink)。
  • 弹性与可扩展性:YARN 允许多种类型的应用程序并发执行,支持集群资源的动态管理,能够根据需要扩展作业或收缩资源。
  • 容错性:ApplicationMaster 和 NodeManager 都具备一定的容错能力,能够在某些任务失败时自动重试。

YARN 调度器类型

YARN 提供了几种不同的调度器来满足不同集群环境的需求:

  1. FIFO Scheduler:最简单的调度器,按任务提交的顺序调度,适合简单的集群环境。
  2. Capacity Scheduler:将资源按容量划分给不同的队列,每个队列拥有一定的资源容量,按队列的形式分配资源,每个队列有固定的容量限制,适用于多租户集群。每个队列可以再按需分配资源,适用于多租户场景。

    源码中,CapacityScheduler 会根据队列的容量、优先级等规则来分配资源。
  3. Fair Scheduler:公平调度,根据公平性原则分配资源,将集群资源平均分配给所有作业,确保所有作业公平共享资源。调度器的核心逻辑是基于 YarnScheduler 接口实现的。不同调度器继承该接口,实现自己的调度算法。


调度器的源码:

public abstract class YarnScheduler {// 获取容器分配给作业public abstract Allocation allocate(ApplicationAttemptId applicationAttemptId,List<ResourceRequest> ask, List<ContainerId> release,List<String> blacklistAdditions, List<String> blacklistRemovals);
}

        在 CapacityScheduler 中,资源分配的逻辑是基于每个队列的容量、应用程序的优先级以及当前可用资源情况来决定的。

容错机制

  • ApplicationMaster 容错:如果 ApplicationMaster 进程失败,ResourceManager 会检测到,并重新启动一个新的 ApplicationMaster,继承先前的工作状态,继续调度剩余的任务。
  • NodeManager 容错:如果某个 NodeManager 挂掉,ResourceManager 会重新分配该 NodeManager 上的任务到其他健康的节点,保证作业能够继续执行。

http://www.ppmy.cn/server/131747.html

相关文章

数据中心物理安全的历史和演变

在当今的数字时代&#xff0c;数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算&#xff0c;数据中心为我们依赖的数字服务提供支持。 随着企业越来…

基于FPGA的多路视频缓存

对于多路视频传输的场合&#xff0c;需要正确设置同步。 uifdma_dbuf0 的写通道输出帧同步计数器直接接入 uifdma_dbuf0&#xff0c;uifdma_dbuf1, uifdma_dbuf2, uifdma_dbuf3 的写通道同步计数输入。uifdma_dbuf0 的读通道&#xff0c;延迟 1 帧于 uifdma_dbuf0 的写通道帧计…

React Native源码学习

核心组件 基础组件&#xff1a;View、Text、Image、TextInput、ScrollView&#xff08;性能没有FlatList好&#xff0c;因为它会一次性把子元素渲染出来&#xff09;、StyleSheet交互组件&#xff1a;button列表视图&#xff1a;FlatList&#xff08;优先渲染屏幕上可见的元素&…

交替最小二乘法(ALS)的工作原理

假设我们有一个评分矩阵&#xff0c;我们希望通过交替优化用户矩阵和物品矩阵来最小化误差。 假设&#xff1a; 我们有一个评分矩阵 ( R )&#xff0c;它的维度是 ( m \times n )&#xff0c;即 ( m ) 个用户和 ( n ) 个物品&#xff08;比如电影、商品等&#xff09;。矩阵分…

CSS常用声明(属性)

目录 一、文本 1、字体属性 2、文本修饰 二、图像 1、图像边框样式 2、图像透明度 三、背景 1、background-color&#xff1a;背景颜色 2、background-img&#xff1a;背景图像 3、背景展示效果 4、background-size&#xff1a;背景图大小 5、background-position&…

Vue3 watch 监视属性

作用&#xff1a;监视数据的变化&#xff08;和Vue2中的watch作用一致&#xff09;特点&#xff1a;Vue3中的watch只能监视以下四种数据&#xff1a; ref定义的数据。reactive定义的数据。函数返回一个值&#xff08;getter函数&#xff09;。一个包含上述内容的数组。 我们在V…

Redis 数据类型list(列表)

目录 1 基本特性 2 主要操作命令 2.1 LPUSH key value [value ...] 2.2 RPUSH key value [value ...] 2.3 LRANGE key start stop 2.4 LINDEX key index 2.5 LLEN key 2.6 LPOP key 2.7 RPOP key 2.8 LTRIM key start stop 2.9 BLPOP key [key ...] timeout 2.10 B…

computed和watch的区别

一、computed&#xff08;计算属性&#xff09; 1. 定义 计算属性是基于 Vue 实例的响应式数据进行计算的属性。它们的值会根据依赖的数据变化而自动更新&#xff0c;并且会被缓存&#xff0c;只有当其依赖的数据发生变化时才会重新计算。 2. 使用场景 衍生状态&#xff1a…