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

深入理解 Hadoop (五)YARN核心工作机制浅析

概述

YARN 的核心设计理念是 服务化(Service)事件驱动(Event + EventHandler)。服务化 和 事件驱动 软件设计思想的引入,使得 YARN 具有低耦合、高内聚的特点,各个模块只需完成各自功能,而模块之间则采用事件联系起来,系统设计简单且维护方便。这种编程方式具有异步、并发等特点,更加高效,更适合大型分布式系统。

YARN Service 服务

对于生命周期较长的对象,YARN 采用了基于服务的对象管理模型对其进行管理,该模型主要有以下几个特点:
将每个被服务化的对象分为 4 个状态:NOTINITED(被创建)、INITED(已初始化)、STARTED(已启动)、STOPPED(已停止)
任何服务状态变化都可以触发另外一些动作。
可通过组合的方式对任意服务进行组合,以便进行统一管理。

public class ResourceManager extends CompositeService implements Recoverable, ResourceManagerMXBean {
}public class NodeManager extends CompositeService implements EventHandler<NodeManagerEvent>, NodeManagerMXBean {
}public class CompositeService extends AbstractService {// 服务集合private final List<Service> serviceList = new ArrayList<Service>();
}public abstract class AbstractService implements Service {
}

ResourceManager 继承关系图

在这里插入图片描述

service 定义

Service 的主要逻辑位于 serviceInt()、serviceStart()、serviceStop() 等方法中。
Service 用到了组合模式 + 装饰者模式

public interface Service extends Closeable {public enum STATE {NOTINITED(0, "NOTINITED"),INITED(1, "INITED"),STARTED(2, "STARTED"),STOPPED(3, "STOPPED");}// 服务初始化void init(Configuration config);// 服务启动void start();// 服务停止void stop();// 服务关闭void close() throws IOException;
}

ResourceManager 的内部构成

在这里插入图片描述

NodeManager 的内部构成

在这里插入图片描述

YARN AsyncDispatcher 事件驱动机制详解

其他的组件提交事件到 这个 AsyncDispatcher,内部通过一个队列来缓冲,然后 AsyncDispatcher 的内部还有一个消费线程,获取队列中的事件,然后做分发到 事件 和 事件处理器 的注册表中,去根据事件找到事件处理器,调用 事件处理器 的 handle 方法来完成事件处理。
异步:这个异步组件的内部,必然包含一个 队列 和一个 消费线程。
AsyncDispatcher:异步事件驱动模型的中央事件调度器,所以它的内部,注册了很多的<Event + EventHandler> 事件处理二元组。
YARN 采用了基于事件驱动的异步通信模型,该模型能够大大增强并发性,从而提高系统整体性能。为了构建该模型,YARN 将各种处理逻辑抽象成事件和对应事件调度器,并将每类事件的处理过程分割成多个步骤,用有限状态机表示。
AsycDispatcher 是 YARN 的中央异步调度器/ 全局事件分发器。在 ResourceManager 中,几乎所有的事件都通过 AsyncDispatcher 进行事件的派发。当一个组件提交一个 事件给 AsyncDispatcher 的时候,AsyncDispatcher 负责给这个事件找到之前注册的 EventHandler 来完成响应的处理。某些特别的 EventHandler 可能是一个 StateMachine。
在这里插入图片描述
整个处理过程大致为:处理请求会作为事件进入系统,由中央异步调度器(AsyncDispatcher)负责传递给相应事件调度器(EventHandler)。该事件调度器可能将该事件转发给另外一个事件调度器,也可能交给一个带有有限状态机的事件处理器,其处理结果也以事件的形式输出给中央异步调度器。而新的事件会再次被中央异步调度器转发给下一个事件调度器,直至处理完成(达到终止条件)。

在 YARN 中,所有核心服务实际上都是一个中央异步调度器,包括 ResourceManager、NodeManager、MRAppMaster 等,它们维护了事先注册的事件与事件处理器,并根据接收的事件类型驱动服务的运行。以 MRAppMaster 为例,它内部包含一个中央异步调度器 AsyncDispatcher,并注册了 TaskAttemptEvent / TaskAttemptImpl、TaskEvent / TaskImpl、JobEvent / JobImpl 等一系列事件/事件处理器,由中央异步调度器统一管理和调度。

在 ResourceManager 或者 NodeManager 等组件中,都有一个 AsyncDispatcher 中央异步事件调度器。在初始化的时候,会将创建的 EventHandler 和对应的事件类型,注册到 AsyncDispatcher 中来,如果 AsyncDispatcher 接收到一个事件,由 GenericEventHandler 完成 eventQueue 的容量维护,并且将事件加入到 eventQueue 中,负责消费 eventQueue 的 eventHandlingThread 则从 eventDispatchers 获取注册的事件对应的 EventHandler 来完成处理。所以:这样子看,AsyncDispatcher 就是一个中央事件调度分发器。

YARN StateMachine 有限状态机

EventHandler 可以理解为简化版的策略模式。

class XXX implemnts EventHandler<>{private StateMachine machine;
}
// 1、XXX 是一个 EventHandler。
// 2、XXX 是一个有限状态机,这个 XXX 的状态变化比较复杂,通过一个有限状态机来维护。
// 3、XXX 称之状态机实体对象,维护了当前的状态信息。

在 YARN 中,每种状态转换(doTransition 方法去执行状态转换,addTransition 注册状态转换)由一个四元组表示,分别是转换前状态(preState)、转换后状态(postState)、事件(event)和回调函数/转换器(hook = Transition)。
连起来解释: 此时是 preState,接收到 event 之后,状态机转换表中获取到对应的 Transition 执行转换,得到一个新状态 postState。YARN 定义了三种状态转换方式,具体如下:

  • 一个初始状态、一个最终状态、一种事件:经过处理之后,无论如何,进入到一个唯一状态。
  • 一个初始状态、多个最终状态、一种事件:不同的逻辑处理结果,可能导致进入不同的状态。
  • 一个初始状态、一个最终状态、多种事件:多个不用的事件,可能触发到多个不同状态的转换。在这里插入图片描述

YARN 有限状态机设计理念

  • 首先构建一个 StateMachineFactory 实例,然后往里面注册响应的状态转换四元组。
  • 调用 StateMachineFactory 的 make() 来构造一个 StateMachine 实例。
  • StateMachineFactory 内部维护了一个 stateMachineTable。
  • 当正常运行过程中,如果接收到一个事件,则根据 此时的状态 和 事件找到对应的转换器 Transition,调用 Transition 的 doTransition 方法来执行转换,得到最终状态。

YARN 中实现了多个状态机对象,包括:
ResourceManager 中的 RMAppImpl、RMAppAttemptImpl、RMContainerImpl 和 RMNodeImpl 等。
NodeManager 中的 ApplicationImpl、ContainerImpl 和 LocalizedResource 等。
MRAppMaster 中的 JobImpl、TaskImpl 和 TaskAttemptImpl 等。

状态机可视化工具

为了便于用户查看这些状态机的状态变化以及相关事件,YARN 提供了一个状态机可视化工具,具体操作步骤如下。
步骤1 将状态机转化为 graphviz(.gv) 格式的文件,在源代码根目录下执行编译命令如下:

mvn compile -Pvisualize

步骤2 使用可视化包 graphviz 中的相关命令生成状态机图,Shell 命令具体如下:

dot -Tpng ResourceManager.gv > ResourceManager.png
dot -Tpng NodeManager.gv > NodeManager.png
dot -Tpng MapReduce.gv > MapReduce.png

如果尚未安装 graphviz 包,操作该步骤之前先要安装该包,centos 安装命令如下:

sudo yum install graphviz

源码中如何查看事件对象处理方式

方式一: 搜枚举类实例,例如:RMNodeEventType.STARTED,搜到的结果是状态机,一般位于 adTransition 方法中。
方式二: 搜枚举类实例,例如:case STARTED 或 RMNodeEventType.class,搜到的结果是事件处理器,一般位于 register 方法中。

相关文章:

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…...

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…...

【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析

基于MATLAB的多模光纤模场分布的仿真分析 一、引言 &#xff08;1&#xff09;多模光纤的概念 多模光纤&#xff08;MMF&#xff09;是一种具有较大纤芯直径的光纤结构&#xff0c;其核心直径通常在10-50微米范围内。与单模光纤&#xff08;SMF&#xff09;相比&#xff0c;…...

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…...

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 &#x1f4a1;解题思路 &#x1f4bb;实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…...

【深度学习环境搭建】Windows搭建Anaconda3、已经Pytorch的GPU版本

目录 搭建Anaconda3搭建GPU版本的Pytorch你的pip也要换源&#xff0c;推荐阿里源打开conda的PowerShell验证 搭建Anaconda3 无脑下载安装包安装&#xff08;自行百度&#xff09; 注意点&#xff1a; 1、用户目录下的.condarc需要配置&#xff08;自定义环境的地址&#xff08…...

基于WebFlux的Websocket的实现,高级实现自定义功能拓展

基于WebFlux的Websocket 一、导入XML依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency><!-- 或者引入jackson --> <dependency><group…...

使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

1、下载 OpenSSL 3.X 库的源代码放到待编译目录 2、解压并接入 OpenSSL 3.X 库源码的根目录 3、复制 ./Configure 一个取名为 ./Configure-clang 4、修改 ./Configure-clang 找到配置段&#xff1a; CC CXX CPP LD 把它们改成 CC > "/usr/bin/clang-…...

【信息安全】hydra爆破工具的使用方法

hydra简介 hydra又名九头蛇&#xff0c;与burp常规的爆破模块不同&#xff0c;hydra爆破的范围更加广泛&#xff0c;可以爆破远程桌面连接&#xff0c;数据库这类的密码。他在kali系统中自带。 参数说明 -l 指定用户名 -L 指定用户名字典文件 -p 指定密码 -P 指…...

uniapp中uview组件库丰富的CountTo 数字滚动使用方法

目录 #平台差异说明 #基本使用 #设置滚动相关参数 #是否显示小数位 #千分位分隔符 #滚动执行的时机 #API #Props #Methods #Event 该组件一般用于需要滚动数字到某一个值的场景&#xff0c;目标要求是一个递增的值。 注意 如果给组件的父元素设置text-align: cente…...

inflate流程分析

一.inflate的三参数重载方法else里面逻辑 我们先看到setContentView里面的inflate的调用链&#xff1a; public View inflate(LayoutRes int resource, Nullable ViewGroup root) {return inflate(resource, root, root ! null);}public View inflate(LayoutRes int resource…...

数据挖掘实战-基于机器学习的电商文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

第8章-第4节-Java中字节流的缓冲流

1、缓冲流&#xff1a;属于高级IO流&#xff0c;并不能直接读写数据&#xff0c;需要依赖于基础流。缓冲流的目的是为了提高文件的读写效率&#xff1f;那么是如何提高文件的读写效率的呢&#xff1f; 在内存中设置一个缓冲区&#xff0c;缓冲区的默认大小是8192字节&#xff…...

NULL是什么?

NULL是一个编程术语&#xff0c;通常用于表示一个空值或无效值。在很多编程语言中&#xff0c;NULL用于表示一个变量或指针不引用任何有效的对象或内存位置。 NULL可以看作是一个特殊的值&#xff0c;表示缺少有效的数据或引用。当一个变量被赋予NULL值时&#xff0c;它表示该变…...

FreeRTOS 基础知识

这个基础知识也是非常重要的&#xff0c;那我们要学好 FreeRTOS&#xff0c;这些都是必不可少的。 那么就来看一下本节有哪些内容&#xff1a; 首先呢就是介绍一下什么是任务调度器。接着呢就是任务它拥有哪一些状态了。那这里的内容不多&#xff0c;但是呢都是非常重要的。 …...

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…...

在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改

文章目录 一、Object.freeze()方法来冻结对象&#xff0c;防止对象被修改1、基本使用2、冻结数组2.1、浅冻结2.1、深冻结 3、应用场景4、Vue中使用Object.freeze 二、Object.assign()方法或展开语法&#xff08;...&#xff09;来合并对象1、Object.assign()1.1、语法1.2、参数…...

池化、线性、激活函数层

一、池化层 池化运算是深度学习中常用的一种操作&#xff0c;它可以对输入的特征图进行降采样&#xff0c;从而减少特征图的尺寸和参数数量。 池化运算的主要目的是通过“收集”和“总结”输入特征图的信息来提取出主要特征&#xff0c;并且减少对细节的敏感性。在池化运算中…...

ES-极客学习第二部分ES 入门

基本概念 索引、文档、节点、分片和API json 文档 文档的元数据 需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览” 索引 kibana 管理ES索引 在系统中找到kibana配置文件&#xff08;我这里是etc/kibana/kibana.yml&#xff09; vim /…...

Nodejs软件安装​

Nodejs软件安装​ 一、简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 官网&#xff1a;http://nodejs.cn/api/ 我们关注于 node.js 的 npm 功能&#xff0c;NPM 是随同 NodeJS 一起安装的包管理工具&#xff0c;JavaScript-NPM&#xff0c;Java-Maven&…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...