当前位置: 首页 > 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 上的任务到其他健康的节点,保证作业能够继续执行。

相关文章:

YARN调度原理详解

YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 集群的资源管理和作业调度框架&#xff0c;它的设计旨在更好地管理和调度 Hadoop 集群中的资源。YARN 解决了传统 Hadoop MapReduce 中资源管理与作业调度紧耦合的问题&#xff0c;使得不同类型的计算任…...

Go-知识泛型

Go-知识泛型 1. 认识泛型1.1 不使用泛型1.2 使用泛型 2. 泛型的特点2.1 函数泛化2.2 类型泛化 3. 类型约束3.1 类型集合3.2 interface 类型集合3.2.1 内置interface类型集合3.2.2 自定义interface类型集合3.2.2.1 任意类型元素3.2.2.2 近似类型元素3.2.2.3 联合类型元素 3.2.3 …...

Qt 如何 发送与解析不定长报文以及数组不定长报文

文章目录 割方式一,采用QDataStream 解析,可直接设定大小端解析,无需自己转换方式二,采用结构体字节对齐方式解析发送接收方割 方式一,采用QDataStream 解析,可直接设定大小端解析,无需自己转换 需要注意的是结构体定义要去掉字节对齐,否则会崩溃,因为由自定义数据结…...

Rust默认使用UTF-8编码来解析源代码文件。如果在代码中包含无法用UTF-8编码表示的字符,编译器会报错!

文章目录 Rust默认编码示例在ANSI编码下中文显示正常的代码在UTF-8编码下将显示不正常在编译时&#xff0c;Rust使用UTF-8编码来解析代码&#xff0c;发现无法用UTF-8编码表示的字符&#xff0c;于是编译器报错 Rust默认编码 Rust 语言默认使用 UTF-8 编码来解析源代码文件。如…...

【jeston】torch相关环境安装

参考&#xff1a;玩转NVIDIA Jetson &#xff08;25&#xff09;— jetson 安装pytorch和torchvision 我的jeston信息&#xff1a; torch install 安装环境 conda create -n your_env python3.8 conda activate your_envpytorch_for_jeston 安装.whl文件 验证&#xff1…...

[CR]厚云填补_大型卫星影像去云数据集

AllClear: A Comprehensive Dataset and Benchmark for Cloud Removal in Satellite Imagery Abstract 卫星图像中的云对下游应用构成了重大挑战。当前云移除研究的一个主要挑战是缺乏一个全面的基准和一个足够大和多样化的训练数据集。为了解决这个问题&#xff0c;我们引入了…...

Langchain CharacterTextSplitter无法分割文档问题

在使用Langchain的文档分割器时&#xff0c;使用CharacterTextSplitter拆分文档是&#xff0c;发现返回的文档根本没有变化&#xff0c;即使设置了chunk_size&#xff0c;返回的大小也不符合参数设置。 CharacterTextSplitter设置了150&#xff0c;但是根本没有处理&#xff0…...

ros service不走是为什么

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;如果ROS服务&#xff08;Service&#xff09;没有正常工作&#xff0c;可能有多种原因。你可以检查以下几点来排查问题&#xff1a; 服务是否正确启动 首先&#xff0c;确保服务节点已经启动并注册了相应的…...

量子计算机的原理与物理实现

量子计算机的原理与物理实现很复杂 指导性原则 首先思考制备一台量子计算机需要些什么&#xff1f; 需要量子比特——二能级量子系统。除了量子计算机需要满足一些物理特性&#xff0c;它还必须要把量子比特绘制到某种初态上&#xff0c;以及测量系统的输出态。 而实验上的挑战…...

SQL Server 常用关键词语法汇总

一、函数 1.1 CAST CAST ( expression AS data_type [ ( length ) ] )expression: 这是你想要转换的数据或表达式。data_type: 目标数据类型&#xff0c;比如 INT, VARCHAR, DATE 等等。(length): 对于某些数据类型&#xff08;如 CHAR, VARCHAR, BINARY, VARBINARY&#xff…...

软件测试工程师面试整理 —— 操作系统与网络基础!

在软件测试中&#xff0c;了解操作系统和网络基础知识对于有效地进行测试工作至关重要。无论是在配置测试环境、调试网络问题&#xff0c;还是在进行性能测试和安全测试时&#xff0c;这些知识都是不可或缺的。 1. 操作系统基础 操作系统&#xff08;Operating System, OS&am…...

网络安全防御策略:通过限制IP访问提升服务器安全性

标题&#xff1a;网络安全防御策略&#xff1a;通过限制IP访问提升服务器安全性 摘要&#xff1a; 在网络安全领域&#xff0c;服务器被入侵是一场严重的事故。一旦发生这种情况&#xff0c;除了立即采取措施恢复系统外&#xff0c;还需要加强后续的安全防护措施。本文将探讨为…...

Multiprocessing出错没有提示was skipped without notice in python

这个问题可以通过打印返回结果解决。 解决方法 比如 Pool.apply_async(csdnKuangXiaoHU, args=(p, DestFile))改成 Result = Pool.apply_async(csdnKuangXiaoHU, args=...

调整应用窗口透明度

朋友问我有没有软件透明得&#xff0c;一开始没理解&#xff0c;他给我发一个&#xff0c;我一看原来时调整窗口透明度得&#xff0c;想着python应该也可以实现&#xff0c;就写了一个。 效果图如下&#xff1a; 源码如下&#xff1a; import sys import ctypes from PySid…...

启智畅想集装箱号码智能识别原理,OCR识别应用

集装箱号码用途&#xff1a; 集装箱号码在填写托运单时是必填项&#xff0c;用于标识和跟踪货物运输过程中的集装箱。它有助于海关管理和物流跟踪&#xff0c;确保货物能够顺利通过海关检查并按时送达目的地。 集装箱号码智能识别原理&#xff1a; 在深入探讨集装箱号码OCR&…...

React基础知识

说明&#xff1a;react版本为 18.3.1 React是什么 React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库。&#xff08;开发基于浏览器的web应用和基于mac和android的移动应用&#xff09;React的优势 1.相较于传统基于DOM开发的优势&#xff1a;组件化的开…...

Java基础:面向对象编程3

1 Java可变长参数 1.1 概述 Java 的可变长参数&#xff08;Varargs&#xff09;是在 Java 1.5 中引入的功能&#xff0c;允许方法接受任意数量的相同类型的参数。可变参数的语法是在参数类型后面加上三个点&#xff08;...&#xff09;&#xff0c;例如 int... numbers。 1.…...

实验kubernetes的CPU绑定策略

CPU 管理配置 CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 或 KubeletConfiguration 中的 cpuManagerPolicy 字段来指定。 支持两种策略&#xff1a; none&#xff1a;默认策略。static&#xff1a;允许为节点上具有某些资源特征的 Pod 赋予增强的 CPU 亲和性和独占…...

Zsh 安装与配置

目录 1 环境配置 1.1 基本工具安装 1.2 安装 oh-my-zsh 1.3 从.bashrc中迁移配置&#xff08;可选&#xff09; 2 主题配置 2.1 内置主题 2.2 自定义主题 2.2.1 推荐主题 3 插件安装 3.1 推荐插件 3.1.1 zsh -autosuggestions 3.1.2 zsh-syntax-highlighting 3.2 启…...

Redis可视化工具Redis Desktop Manager(附安装包)

前言 redis工具&#xff0c;我相信每个开发都需要&#xff0c;如果每次查都去client执行指令&#xff0c;我怕查完之后&#xff0c;老大就要发版咯。我之前一直用的Redis可视化工具RedisDesktopManager&#xff0c;总觉得差点意思&#xff0c;直到同事推荐了个新的&#xff0c…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...