YARN 状态机库

2024-05-04 08:58
文章标签 状态 yarn 机库

本文主要是介绍YARN 状态机库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

状态机库

状态机由一组状态组成, 这些状态分为三类 : 初始状态、 中间状态和最终状态。 状态机从初始状态开始运行, 经过一系列中间状态后, 到达最终状态并退出。 在一个状态机中,每个状态都可以接收一组特定事件, 并根据具体的事件类型转换到另一个状态。 当状态机转换到最终状态时, 则退出。

YARN 状态转换方式

在 YARN 中, 每种状态转换由一个四元组表示, 分别是转换前状态(preState)、 转换后状态(postState)、 事件(event) 和回调函数(hook)。 YARN 定义了三种状态转换方式,具体如下:

1) 一个初始状态、 一个最终状态、 一种事件(见下图)。 该方式表示状态机在 preState状态下, 接收到 Event 事件后, 执行函数状态转移函数 Hook, 并在执行完成后将当前状态转换为 postState。

这里写图片描述

2) 一个初始状态、 多个最终状态、 一种事件(见下图)。 该方式表示状态机在preState 状态下, 接收到 Event 事件后, 执行函数状态转移函数 Hook, 并将当前状态转移为函数 Hook 的返回值所表示的状态。

这里写图片描述

3) 一个初始状态、 一个最终状态、 多种事件(见图下图)。 该方式表示状态机在preState 状态下, 接收到 Event1、 Event2 和 Event3 中的任何一个事件, 将执行函数状态转移函数 Hook, 并在执行完成后将当前状态转换为 postState。

这里写图片描述

YARN 自 己 实 现 了 一 个 非 常 简 单 的 状 态 机 库(位 于 包 org.apache.hadcop.yarn.state中), 具体如图所示。 YARN 对外提供了一个状态机工厂 StatemachineFactory, 它提供多种 addTransition 方法供用户添加各种状态转移, 一旦状态机添加完毕后, 可通过调用installTopology 完成一个状态机的构建。

这里写图片描述

状态机的使用方法

本小节将给出一个状态机应用实例, 在该实例中, 创建一个作业状态机 JobStateMachine,该状态机维护作业内部的各种状态变化。 该状态机同时也是一个事件处理器, 当接收到某种事件后, 会触发相应的状态转移。

1) 定义作业类型。

public enum JobEventType {
JOB_KILL,
JOB_INIT,
JOB_START,
JOB_SETUP_COMPLETED,
JOB_COMPLETED
} 

2) 定义作业状态机。

@SuppressWarnings({ "rawtypes", "unchecked" })
public class JobStateMachine implements EventHandler<JobEvent>{
private final String jobID;
private EventHandler eventHandler;
private final Lock writeLock;
private final Lock readLock;
// 定义状态机
protected static final
StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent>
stateMachineFactory
= new StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent>
(JobStateInternal.NEW)
.addTransition(JobStateInternal.NEW, JobStateInternal.INITED,
JobEventType.JOB_INIT,
new InitTransition())
.addTransition(JobStateInternal.INITED, JobStateInternal.SETUP,
JobEventType.JOB_START,
new StartTransition())
.addTransition(JobStateInternal.SETUP, JobStateInternal.RUNNING,
JobEventType.JOB_SETUP_COMPLETED,
new SetupCompletedTransition())
.addTransition
(JobStateInternal.RUNNING,
EnumSet.of(JobStateInternal.KILLED, JobStateInternal.SUCCEEDED),
JobEventType.JOB_COMPLETED,
new JobTasksCompletedTransition())
.installTopology();
private final StateMachine<JobStateInternal, JobEventType, JobEvent> stateMachine;
public JobStateMachine(String jobID, EventHandler eventHandler) {
this.jobID = jobID;
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
this.readLock = readWriteLock.readLock();
this.writeLock = readWriteLock.writeLock();
this.eventHandler = eventHandler;
stateMachine = stateMachineFactory.make(this);
}
protected StateMachine<JobStateInternal, JobEventType, JobEvent> getStateMachine() {
return stateMachine;
}
public static class InitTransition
implements SingleArcTransition<JobStateMachine, JobEvent> {
@Override
public void transition(JobStateMachine job, JobEvent event) {
System.out.println("Receiving event " + event);
job.eventHandler.handle(new JobEvent(job.getJobId(), JobEventType.JOB_START));
}
}
public static class StartTransition
implements SingleArcTransition<JobStateMachine, JobEvent> {
@Override
public void transition(JobStateMachine job, JobEvent event) {
System.out.println("Receiving event " + event);
job.eventHandler.handle(new JobEvent(job.getJobId(), JobEventType.JOB_SETUP_COMPLETED));
}
}
…
// 定义类 SetupCompletedTransition 和 JobTasksCompletedTransition
@Override
public void handle(JobEvent event) {
try {
writeLock.lock();
JobStateInternal oldState = getInternalState();
try {
getStateMachine().doTransition(event.getType(), event);
} catch (InvalidStateTransitonException e) {
System.out.println("Can't handle this event at current state");
}
if (oldState != getInternalState()) {
System.out.println("Job Transitioned from " + oldState + " to "
+ getInternalState());
}
}
finally {
writeLock.unlock();
}
}
public JobStateInternal getInternalState() {
readLock.lock();
try {
return getStateMachine().getCurrentState();
} finally {
readLock.unlock();
}
}
public enum JobStateInternal { // 作业内部状态
NEW,
SETUP,
INITED,
RUNNING,
SUCCEEDED,
KILLED,
}
}

状态机可视化

YARN 中实现了多个状态机对象, 包括 ResourceManager 中的 RMAppImpl、 RMAppAttemptImpl、RMContainerImpl 和 RMNodeImpl, NodeManager 中的 ApplicationImpl、ContainerImpl 和LocalizedResource, MRAppMaster 中的 JobImpl、 TaskImpl 和 TaskAttemptImpl等。 为了便于用户查看这些状态机的状态变化以及相关事件, YARN 提供了一个状态机可视化工具 , 具体操作步骤如下。

步骤 1 将状态机转化为 graphviz(.gv) 格式的文件, 编译命令如下:

mvn compile -Pvisualize

经过该步骤后, 本地目录中生成了 ResourceManager.gv、 NodeManager.gv 和 MapReduce.gv 三个 graphviz 格式的文件(有兴趣可以直接打开查看具体内容)。

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

dot -Tpng NodeManager.gv > NodeManager.png

如果尚未安装 graphviz 包, 操作该步骤之前先要安装该包。

这篇关于YARN 状态机库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958821

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

qml states 状态

states 状态 在QML中,states用于定义对象在不同状态下的属性变化。每个状态可以包含一组属性设置,当状态改变时,这些属性设置会被应用到对象上。 import QtQuick 2.15import QtQuick.Controls 2.15// 定义应用程序的主窗口ApplicationWindow {visible: true // 使窗口可见width: 640 /

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本

OS: Armbian OS 24.5.0 Bookworm Mariadb V11.02及以上版本 Webmin:V2.202 小众问题,主要是记录一下。 如题 Webmin 默认无法 Mariadb V11.02及以上版本 如果对 /etc/webmin/mysql/config 文件作相应调整就可以再现Mariadb管理界面。 路径+文件:/etc/webmin/mysql/config