【Hadoop】集群资源管理器 YARN

一、yarn 简介

Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.x 引入的分布式资源管理系统。主要用于解决 hadoop 1.x 架构中集群资源管理和数据计算耦合在一起,导致维护成本越来越高的问题。

yarn主要负责管理集群中的CPU和内存

用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配。

在这里插入图片描述

二、yarn架构

yarn架构中主要包括ResourceManager和NodeManager

  • 在NodeManager组件内会产生Container容器
  • MapReduce任务在运行期间产生的具体子任务会运行在Container容器中

1. ResourceManager

yarn集群的主节点,支持1个或2个,是整个集群资源的主要协调者和管理者

ResourceManager 负责给用户提交的所有应用程序分配资源,它根据应用程序优先级、队列容量、ACLs、数据位置等信息,做出决策,然后以共享的、安全的、多租户的方式制定分配策略,调度集群资源。

2. NodeManager

yarn集群的从节点,支持1个或多个,主要负责当前节点的管理,监视资源和跟踪节点健康。具体如下:

  • 启动时向 ResourceManager 注册并定时发送心跳消息,等待 ResourceManager 的指令
  • 维护 Container 的生命周期,监控 Container 的资源使用情况
  • 管理任务运行时的相关依赖,根据 ApplicationMaster 的需要,在启动 Container 之前将需要的程序及其依赖拷贝到本地

3. Container

对任务环境进行抽象,封装了CPU和内存、环境变量、启动命令等任务运行信息

YARN 会为每个子任务分配一个 Container,子任务只能使用该 Container 中描述的资源

4. ApplicationMaster

负责应用程序相关的事务,例如任务调度,任务监控等

在用户提交一个应用程序时,YARN 会启动一个轻量级的进程 ApplicationMaster。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器内资源的使用情况,同时还负责任务的监控与容错。具体如下:

  • 根据应用的运行状态来决定动态计算资源需求
  • 向 ResourceManager 申请资源,监控申请的资源的使用情况
  • 跟踪任务状态和进度,报告资源的使用情况和应用的进度信息
  • 负责任务的容错

我理解比如在flink任务运行过程中,去机器上干掉一个tm,然后发现flink任务很快就恢复了,这个事情应该就是AM来做的

三、yarn工作原理简述

在这里插入图片描述

  1. Client 提交作业到 YARN 上
  2. Resource Manager 选择一个 Node Manager,启动一个 Container 并运行 Application Master 实例
  3. Application Master 根据实际需要向 Resource Manager 请求更多的 Container 资源(如果作业很小, 应用管理器会选择在其自己的 JVM 中运行任务)
  4. Application Master 通过获取到的 Container 资源执行分布式计算

四、YARN工作原理详述

1. MapReduce任务

以MapReduce任务为例说明yarn的工作原理

在这里插入图片描述

  1. 作业提交

    client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业 (第 1 步) 。新的作业 ID(应用 ID) 由资源管理器分配 (第 2 步)。作业的 client 核实作业的输出, 计算输入的 split, 将作业的资源 (包括 Jar 包,配置文件, split 信息) 拷贝给 HDFS(第 3 步)。 最后, 通过调用资源管理器的 submitApplication() 来提交作业 (第 4 步)。

  2. 作业初始化

    当资源管理器收到 submitApplciation() 的请求时, 就将该请求发给调度器 (scheduler), 调度器分配 container, 然后资源管理器在该 container 内启动应用管理器进程, 由节点管理器监控 (第 5 步)。

    MapReduce 作业的应用管理器是一个主类为 MRAppMaster 的 Java 应用,其通过创造一些 bookkeeping 对象来监控作业的进度, 得到任务的进度和完成报告 (第 6 步)。然后其通过分布式文件系统得到由客户端计算好的输入 split(第 7 步),然后为每个输入 split 创建一个 map 任务, 根据 mapreduce.job.reduces 创建 reduce 任务对象。

  3. 任务分配

    如果作业很小, 应用管理器会选择在其自己的 JVM 中运行任务。

    如果不是小作业, 那么应用管理器向资源管理器请求 container 来运行所有的 map 和 reduce 任务 (第 8 步)。这些请求是通过心跳来传输的, 包括每个 map 任务的数据位置,比如存放输入 split 的主机名和机架 (rack),调度器利用这些信息来调度任务,尽量将任务分配给存储数据的节点, 或者分配给和存放输入 split 的节点相同机架的节点。

  4. 任务运行

    当一个任务由资源管理器的调度器分配给一个 container 后,应用管理器通过联系节点管理器来启动 container(第 9 步)。任务由一个主类为 YarnChild 的 Java 应用执行, 在运行任务之前首先本地化任务需要的资源,比如作业配置,JAR 文件, 以及分布式缓存的所有文件 (第 10 步。 最后, 运行 map 或 reduce 任务 (第 11 步)。

    YarnChild 运行在一个专用的 JVM 中, 但是 YARN 不支持 JVM 重用。

  5. 进度和状态更新

    YARN 中的任务将其进度和状态 (包括 counter) 返回给应用管理器, 客户端每秒 (通 mapreduce.client.progressmonitor.pollinterval 设置) 向应用管理器请求进度更新, 展示给用户。

  6. 作业完成

    除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion() 来检查作业是否完成,时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作业完成之后, 应用管理器和 container 会清理工作状态, OutputCommiter 的作业清理方法也会被调用。作业的信息会被作业历史服务器存储以备之后用户核查。

2. Flink任务

以Flink任务为例说明yarn的工作原理

在这里插入图片描述

  • 当启动一个新的Flink YARN Client会话时,客户端首先会检查所请求的资源(容器和内存)是否可用,之后,它会上传Flink配置和JAR文件到HDFS。
  • 客户端的下一步是向ResourceManager请求一个YARN容器启动ApplicationMaster。JobManager和ApplicationMaster(AM)运行在同一个容器中,一旦它们成功地启动了,AM就能够知道JobManager的地址,它会为TaskManager生成一个新的Flink配置文件(这样它才能连上JobManager),该文件也同样会被上传到HDFS。另外,AM容器还提供了Flink的Web界面服务。Flink用来提供服务的端口是由用户和应用程序ID作为偏移配置的,这使得用户能够并行执行多个YARN会话。
  • 之后,AM开始为Flink的TaskManager分配容器(Container),从HDFS下载JAR文件和修改过的配置文件,一旦这些步骤完成了,Flink就可以基于Yarn运行任务了。

五、YARN中的资源调度器

实际使用过程中,集群的资源是有限的,当集群资源被占到99%,但有一个紧急的任务需要立即执行时,我们只能杀死正在执行的任务,为新来的任务腾地方

为从源头解决这种问题,需要给yarn选择合适的资源调度器

yarn中一共支持三种资源调度器

  • FIFO schedular:先进先出调度器,所有任务被提交后都是需要排队的,当资源不够时,只能等前面的任务执行完毕释放了足够资源才能执行

  • Capacity schedular:容量调度器,FIFO的多队列版本,先把集群资源划分为队列,每个队列资源独立,每个队列中的任务还是以FIFO的方式执行

  • Fair schedular:公平调度器,支持多个队列,每个队列可以配置多个一定的资源,每个任务中的任务共享其所在队列的所有资源,假设往队列里提了一个任务,占用了整个资源,再提第二个任务时,第一个任务会释放一部分资源给第二个任务

实际工作中,Capacity schedular是应用最广泛的,同时也是yarn默认的资源调度器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/201095.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ISCTF2023] Crypto/PWN/Reverse

最近新生赛还挺多,不过这个开始后注册页面就被删了,没注册上。拿别人的附件作了下。 Crypto 七七的欧拉 这题只给了n,e,c这种情况一般正常没法解,猜n不正常 import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{****…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包:一个物品可以使用无数次,将01背包中倒序遍历背包变成正序遍历背包 遍历顺序:在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的! 先遍历物品,后遍历背包可以&#…

docker搭建rabbit集群

1.去rabbitMQ官网拉去images 我当前使用的是最新版本的镜像:rabbitmq:3.12-management 2.创建一个集群专用网络 docker的容器相互隔离是不可通信的,我们自行创建一个网络后,创建容器时 给他们放在一起,就可以通信了。 docker netw…

2023年【安全员-A证】考试题及安全员-A证最新解析

题库来源:安全生产模拟考试一点通公众号小程序 安全员-A证考试题考前必练!安全生产模拟考试一点通每个月更新安全员-A证最新解析题目及答案!多做几遍,其实通过安全员-A证模拟考试题很简单。 1、【多选题】下列关于高处作业吊篮叙…

基于深度学习的点云三维目标检测方法综述

论文标题:基于深度学习的点云三维目标检测方法综述 作者:郭毅锋1,2†,吴帝浩1,魏青民1 发表日期: 2023 1 阅读日期 :2023 11 29 研究背景&…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境: HP ProDesk 480 G7 Win10 专业版 问题描述: INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因: 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】计算机毕业设计

基于sprinmgboot实现实习管理系统的设计与实现演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,…

Condition原码分析及实现原理

一、引言 Java作为一种广泛应用于企业级开发的编程语言,其内部机制和特性被许多开发者所关注。本文将深入分析Java Condition原码,以及Condition接口的实现原理,为大家提供一个更深入的了解。 二、Condition概述 Condition是Java并发编程中一…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通(第5版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章,…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具,用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库,用于存储和管理软件包,并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

vue项目中通过vuex管理数据

目录 1.前言: 2.vuex的基础用法: 1.构建与挂载vue 基础模板渲染 构建仓库 2.mutations的使用 1.介绍 ​编辑 2.案列: 3.传参 4.辅助函数mapMutations: 3.module分对象的写法 介绍 建立模块: 访问数据的方…

python接口自动化测试之requests库的基础使用

简单介绍 requests库简单易用的HTTP库 Get请求 格式: requests.get(url) 注意:若需要传请求参数,可直接在 url 最后的 ? 后面,也可以调用 get() 时多加一个参数 params ,传入请求参数,注意需要是 dict…

0基础学java-day8

一、项目-零钱通 1 项目开发流程说明 1.1 项目需求说明 使用 Java 开发 零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能. 1.2 项目的界面 化繁为简. 1) 先完成显示菜单,并可以选择 2) 完成零钱通明细. 3) 完成…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

leetcode:循环队列

题目描述 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们开辟空间的时候多开一个&#xff0c;k是队列的长度&#xff0c;我们开k1个空间&#xff0c;定义一个front指向头&#xff0c;back的下一个指向尾 当frontback的时候&am…

八、hdfs文件系统副本块数量的配置

1、配置方式 2、实际操作演示 &#xff08;1&#xff09;在Hadoop用户的根目录下创建text.txt文件 &#xff08;2&#xff09;上传文件 hadoopnode1:~$ hdfs dfs -ls hdfs://node1:8020/ Found 4 items drwxr-xr-x - hadoop supergroup 0 2023-11-21 23:06 hdfs:/…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下&#xff1a; package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

如何在代码中启动与关闭ROS节点

在ROS开发中&#xff0c;节点的管理是很重要的一部分&#xff0c;其中有一些节点大部分时候用不到&#xff0c;只会在特定情况下被启动&#xff08;比如建图节点&#xff09;同时这些节点在使用完后还需要被关闭&#xff0c;因此我们就需要在程序中对这些节点进行启动与关闭的管…

【C++】继承(上) 继承的基本概念 | 子类的默认成员函数

一、继承 概念 继承(inheritance)是一种面向对象编程的概念&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff08;称为父类或基类&#xff09;的特征和行为。子类可以获得父类的成员函数和变量&#xff0c;而不需要重新编写它们。子类还…