【yarn】yarn rest api每日job数量分析
一、说明
# 无法制定时间范围!!!
yarn application -list
官方文档
rest返回内容(官网案例):
{app":{"id":"application_1324057493980_0001","user":"user1","name":"","queue":"default","state":"ACCEPTED","finalStatus":"UNDEFINED","progress":0,"trackingUI":"UNASSIGNED","diagnostics":"","clusterId":1324057493980,"startedTime":1324057495921,"finishedTime":0,"elapsedTime":2063,"amContainerLogs":"http:\/\/amNM:2\/node\/containerlogs\/container_1324057493980_0001_01_000001","amHostHttpAddress":"amNM:2"}
}
二、代码
gradle项目build.gradle
内容
plugins {id 'java'id 'scala'id 'com.github.johnrengelman.shadow' version '7.1.2'
}group = 'com.test'
version = '1.0'
description = 'yarn-job-stat'repositories {maven { url "https://maven.aliyun.com/repository/releases" }maven { url "https://maven.aliyun.com/repository/google" }maven { url "https://maven.aliyun.com/repository/central" }maven { url "https://maven.aliyun.com/repository/gradle-plugin" }maven { url "https://maven.aliyun.com/repository/public" }mavenCentral()
}ext {scala_version = '2.11.12'scala_major_version = '2.11'scalatest_version = '3.2.12'scalactic_version = '3.2.12'jackson_version = "2.10.3"jackson_core_module = "com.fasterxml.jackson.core:jackson-core"jackson_annotations_module = "com.fasterxml.jackson.core:jackson-annotations"jackson_databind_module = "com.fasterxml.jackson.core:jackson-databind"jackson_dataformat_xml_module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml"jackson_module_scala_module = "com.fasterxml.jackson.module:jackson-module-scala_2.11"jackson_module_paranamer_module = "com.fasterxml.jackson.module:jackson-module-paranamer"
}dependencies {runtimeOnly 'org.jetbrains.kotlin:kotlin-reflect:1.9.10' // for runtime on linuximplementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.10'implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation("${jackson_core_module}:${jackson_version}")implementation("${jackson_annotations_module}:${jackson_version}")implementation("${jackson_databind_module}:${jackson_version}")implementation("${jackson_dataformat_xml_module}:${jackson_version}")implementation("${jackson_module_scala_module}:${jackson_version}")implementation("org.scala-lang:scala-library:${scala_version}")implementation("org.scala-lang:scala-reflect:${scala_version}")implementation("org.scala-lang:scala-compiler:${scala_version}")testRuntimeOnly("org.scala-lang:scala-library:${scala_version}")testRuntimeOnly("org.scala-lang:scala-reflect:${scala_version}")testRuntimeOnly "org.scala-lang:scala-compiler:${scala_version}"testImplementation platform('org.junit:junit-bom:5.9.1')testImplementation('org.junit.jupiter:junit-jupiter')compileOnly("org.scalactic:scalactic_2.11:${scalactic_version}")testImplementation "org.scalatest:scalatest_2.11:${scalatest_version}"testRuntimeOnly("org.scalatestplus:junit-5-10_2.11:3.2.17.0")
}test {useJUnitPlatform {includeEngines 'scalatest'testLogging {events("passed", "skipped", "failed", "standard_error")}}
}tasks.withType(ScalaCompile) {scalaCompileOptions.additionalParameters = ['-unchecked', '-deprecation']
}
shadowJar {archiveBaseName.set("${this.description}")archiveClassifier.set('shadow')archiveVersion.set("${version}")configurations = [project.configurations.runtimeClasspath]dependencies {include(dependency('org.scala-lang:scala-library:'))include(dependency('com.fasterxml.jackson.core::'))include(dependency('com.fasterxml.jackson.module::'))include(dependency('com.fasterxml.jackson.dataformat::'))include(dependency('com.squareup.okhttp3::'))include(dependency('com.squareup.okio::'))include(dependency('com.thoughtworks.paranamer::'))include(dependency('org.jetbrains.kotlin:kotlin-reflect:1.9.10')) // java -jar依赖,本地调试无需include(dependency('org.jetbrains.kotlin:kotlin-stdlib:1.9.10')) // java -jar依赖,本地调试无需}manifest {attributes 'Main-Class': 'YarnJobCount'}
}
Apps.scala
case class Apps(app: Seq[YarnApplication])case class YarnJobCount(id: String,user: String,name: String,state: String,finalStatus: String,applicationType: String,startedTime: Long,launchTime: Long,finishedTime: Long,elapsedTime: Long)
import java.time.LocalDateTime
case class Interval(startStr: String, endStr: String, startTs: Long, endTs: Long, startDt: LocalDateTime, endDt: LocalDateTime)
import java.io.{File, PrintWriter}
import com.fasterxml.jackson.databind.{DeserializationFeature, JsonNode, ObjectMapper}
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import okhttp3.{OkHttpClient, Request}import java.time.{LocalDateTime, ZoneOffset}
import java.time.format.DateTimeFormatter
import scala.collection.mutable/*** java -jar yarn-job-stat-1.0-shadow.jar "yarn-api:8088" "2024-11-14 00:00:00" "2024-11-15 00:00:00"*/object YarnJobAnalyse {val MONTH = "m"val DAY = "d"val HOUR = "h"val MODES: Seq[String] = Seq(MONTH, DAY, HOUR)var mode = DAYval df: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")val fileName = "yarn-job-stat.csv"var startTime: String = "2024-11-14 00:00:00"var endTime: String = "2024-11-15 00:00:00"var currHost: String = null // like "yarn-api:8088"var dayList: mutable.ListBuffer[Interval] = mutable.ListBuffer.emptyvar mapper: ObjectMapper = JsonMapper.builder().addModule(DefaultScalaModule).build()mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)val client = new OkHttpClient()def toMilli(dt: String): Long = {val lt = LocalDateTime.parse(dt, df)val ins = lt.toInstant(ZoneOffset.of("+08:00"))val milli = ins.toEpochMillimilli}def toMilli(dt: LocalDateTime): Long = {val ins = dt.toInstant(ZoneOffset.of("+08:00"))val milli = ins.toEpochMillimilli}def addTime(ld:LocalDateTime):LocalDateTime={mode match{case MONTH=>ld.plusMonths(1)case DAY=>ld.plusDays(1)case HOUR=>ld.plusHours(1)case _=>throw new IllegalArgumentException(s"unsupported interval ${mode}!")}}def initTime(): Unit = {val dtStart: LocalDateTime = LocalDateTime.parse(startTime, df)val dtEnd: LocalDateTime = LocalDateTime.parse(endTime, df)var tmp0: LocalDateTime = dtStartvar tmp1: LocalDateTime = addTime(tmp0)while (!tmp1.isAfter(dtEnd)) {val iv = Interval(tmp0.toString, tmp1.toString, toMilli(tmp0), toMilli(tmp1), tmp0, tmp1)dayList.append(iv)tmp0 = tmp1tmp1 = addTime(tmp1)}}def parse(t: Interval, sb: StringBuilder): Unit = {val start = t.startTsval end = t.endTsval url = s"http://${currHost}/ws/v1/cluster/apps?startedTimeBegin=${start}&startedTimeEnd=${end}"println(s"Ready to query url: ${url}")val request = new Request.Builder().url(url).get().build()val response = client.newCall(request).execute()val respStr = response.body().string()// println(s"response: \n${respStr}")val node: JsonNode = mapper.readTree(respStr).get("apps")val apps = mapper.treeToValue(node, classOf[Apps])if (apps != null && apps.app != null) {// println(s"apps count:${apps.app.size}")val jobStateCount = apps.app.toList.groupBy(app => app.finalStatus).map(kv => (kv._1, kv._2.size)).toList.sortBy(kv => kv._2).reverse// jobStateCount.foreach(e => println(s"state:${e._1}, count:${e._2}"))jobStateCount.foreach(e => sb.append(s"${t.startStr},${t.endStr},${e._1},${e._2}\n"))}}def write(fileName: String, fileContext: String): Unit = {val writer = new PrintWriter(new File("./" + fileName))writer.write(fileContext)writer.close()println("write complete!")}def main(args: Array[String]): Unit = {assert(args.length == 4)mode = args(0)assert(MODES.contains(mode), s"mode should be ${MODES.toString()},but got ${mode}")currHost = args(1)startTime = args(2)endTime = args(3)println(s"yarn url:${currHost},start:${startTime},end:${endTime}")initTime()val sb: StringBuilder = new StringBuilder()sb.append("start,end,state,count\n")if (this.dayList.nonEmpty) {this.dayList.foreach(p => parse(p, sb))}write(fileName, sb.toString())}
}
三、使用
# d就是day!
java -jar yarn-job-stat-1.0-shadow.jar "d" "yarn-api:8088" "2024-11-14 00:00:00" "2024-11-18 00:00:00"
相关文章:
【yarn】yarn rest api每日job数量分析
一、说明 # 无法制定时间范围!!! yarn application -list 官方文档 rest返回内容(官网案例): {app":{"id":"application_1324057493980_0001","user":"user1&q…...

蓝桥杯单片机第十一届省赛(第一场)
主函数代码 #include<iic.h> #include<intrins.h>sfr P40xc0; sbit R3P3^2; sbit R4P3^3; sbit C4P3^4; sbit C3P3^5;unsigned char code led_nodot[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code led_dot[]{0x40,0x79,0x24,0x30,0x…...

hive复杂数据类型Array Map Struct 炸裂函数explode
1、Array的使用 create table tableName( ...... colName array<基本类型> ...... ) 说明:下标从0开始,越界不报错,以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表: create table arr1(n…...

FIFO架构专题-FIFO是什么
目录 简介: FIFO参数: 1.宽度WIDTH(一次位数) 2.深度DEEPTH(存多少次) FIFO的分类: 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...
Pythony——多线程简单爬虫实现
简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表,这里是博客园的分页地址,从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...
如何修改 a 链接的样式
在CSS中,你可以使用选择器来针对HTML中的特定元素(例如<a>标签,也就是链接)进行修改样式。以下是一些常见的修改<a>链接样式的方法: 移除下划线: a { text-decoration: none; } 修改链接的…...

第6章 详细设计-6.5 软硬件接口文档设计
6.5 软硬件接口文档设计 一般的产品都包含硬件和软件两部分,产品设计阶段需要确保硬件开发人员和软件开发的沟通准确、高效。所以需要一份书面的文档来承载软件和硬件之间的沟通细节。以下面的细水雾除尘设备为例进行讲解,涉及软件和硬件的接口ÿ…...

【pyspark学习从入门到精通14】MLlib_1
目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…...

C++全局构造和初始化
片段摘自程序员的自我修养—链接、装载与库.pdf 11.4 程序在进入main之前,需要对全局对象进行构造初始化。 glibc全局对象进行构造初始化 gibc启动程序时会经过.init段,退出程序时会经过.finit段。这两个段中的代码最终拼接成_init()和_finit(),这两个…...

安全见闻-泷羽sec课程笔记
编程语言 C语言:一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来,支持面向对象编程,常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言,具有跨平台…...

游戏引擎学习第17天
视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标: 处理键盘输入:将键盘输入的处理逻辑从平台特定的代码中分离出来,放入更独立的函数中以便管理。优化消息循环:确保消息循环能够有效处理 …...
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...

【学习笔记】量化概述
Quantize量化概念与技术细节 题外话,在七八年前,一些关于表征的研究,会去做表征的压缩,比如二进制嵌入这种事情,其实做得很简单,无非是找个阈值,然后将浮点数划归为零一值,现在的Qu…...

同步互斥相关习题10道 附详解
PV操作 2016 某系统允许最多10个进程同时读文件F,当同时读文件F的进程不满10个时,欲读该文件的其他文件可立即读,当已有10个进程在读文件F时读,其他欲读文件F的进程必须等待,直至有进程读完后退出方可去读 在实现管…...

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)
【Python PyTorch】卷积神经网络 CNN(LeNet-5网络) 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...
Git 拉取指定分支创建项目
一 背景 因为项目过大,只需要部分分支的代码即可。 二 实现 方法一:使用 --single-branch 参数 git clone 支持只拉取指定分支,而不是整个库的所有分支: git clone --branch <branch_name> --single-branch <reposi…...

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)
思路:一个二分图是由两个集合组成的,同一个集合中的节点间不能连边,所以一个二分图最多有cnt[1]*cnt[2]条边,题目给出一个树的n-1条边,要我们添加最多的边数使他成为二分图,添加的边数就是cnt[1]*cnt[2]-n1…...
React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
在 React Native 应用中,数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理,包括 React Hooks、Context API 以及第三方状态管理库(如 Redux)。本章节将详细介绍 React Hooks 的基础…...
传奇996_22——自动挂机
登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...
faiss 提供了多种索引类型
faiss 多种索引类型 在 faiss 中,IndexFlatL2 是一个简单的基于 L2 距离(欧几里得距离)进行索引的索引类型,但实际上,faiss 提供了多种索引类型,支持不同的度量方式和性能优化,您可以根据需求选…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...