当前位置: 首页 > news >正文

YARN调度原理详解

        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.lryc.cn/news/460811.html

相关文章:

  • Go-知识泛型
  • Qt 如何 发送与解析不定长报文以及数组不定长报文
  • Rust默认使用UTF-8编码来解析源代码文件。如果在代码中包含无法用UTF-8编码表示的字符,编译器会报错!
  • 【jeston】torch相关环境安装
  • [CR]厚云填补_大型卫星影像去云数据集
  • Langchain CharacterTextSplitter无法分割文档问题
  • ros service不走是为什么
  • 量子计算机的原理与物理实现
  • SQL Server 常用关键词语法汇总
  • 软件测试工程师面试整理 —— 操作系统与网络基础!
  • 网络安全防御策略:通过限制IP访问提升服务器安全性
  • Multiprocessing出错没有提示was skipped without notice in python
  • 调整应用窗口透明度
  • 启智畅想集装箱号码智能识别原理,OCR识别应用
  • React基础知识
  • Java基础:面向对象编程3
  • 实验kubernetes的CPU绑定策略
  • Zsh 安装与配置
  • Redis可视化工具Redis Desktop Manager(附安装包)
  • sql server删除过期备份文件脚本
  • 【Docker系列】Docker查看镜像架构
  • Python案例 | 测试网络的下载速度上传速度和 ping 延迟
  • 一键找回,2024四大固态硬盘数据恢复工具推荐!
  • 数据结构~AVL树
  • ffmpeg面向对象——rtsp拉流探索(1)
  • 【启明智显分享】ZX7981PM WIFI6 5G-CPE:2.5G WAN口,2.4G/5G双频段自动调速
  • openresty“热部署“lua
  • 基于SpringBoot+Vue+MySQL的企业招聘管理系统
  • vue3之defineComponent
  • springboot+vue家政服务管理平台