【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 提供了多种索引类型,支持不同的度量方式和性能优化,您可以根据需求选…...
避坑指南:运行YooAsset 2.3.9官方Demo时,你可能会遇到的Sprite白块和退出报错
避坑指南:YooAsset 2.3.9官方Demo运行时的Sprite白块与退出报错深度解析 当Unity开发者初次接触YooAsset资源管理系统时,官方Demo往往是快速上手的最佳途径。然而在YooAsset 2.3.9版本的示例项目中,不少开发者反馈遇到了两个典型问题&#x…...
OpenClaw+GLM-4.7-Flash:学术论文辅助写作全流程
OpenClawGLM-4.7-Flash:学术论文辅助写作全流程 1. 为什么需要AI辅助学术写作 作为一名经常需要撰写学术论文的研究者,我深刻体会到写作过程中的痛点。从海量文献中筛选关键信息、整理参考文献格式、反复修改论文结构,这些工作往往耗费大量…...
ChatTTS一键启动:从零搭建语音合成服务的实战指南
语音合成服务在现代应用中扮演着越来越重要的角色。它被广泛应用于智能客服、有声读物生成和视频内容配音等场景。通过将文本转化为自然流畅的语音,极大地提升了人机交互的体验和应用的可访问性。 然而,对于希望快速部署ChatTTS这类先进语音合成模型的开…...
建立情感绑架链:让团队恐惧失去你——软件测试从业者的职场影响力解析
测试工程师的隐形权力困境 在软件研发体系中,测试工程师常陷入价值被低估的困境。当迭代压力激增时,测试周期首当其冲被压缩;当线上出现故障时,测试环节却成为追责焦点。这种结构性矛盾催生出一种特殊的职场生存策略——通过构建…...
3分钟轻松搞定!BetterNCM Installer一键安装插件管理器完全指南
3分钟轻松搞定!BetterNCM Installer一键安装插件管理器完全指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的复杂步骤而烦恼吗?B…...
3步掌握DoL-Lyra整合包:从零到精通的完整指南
3步掌握DoL-Lyra整合包:从零到精通的完整指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS Degrees of Lewdity中文整合包DoL-Lyra为您提供了一站式的游戏体验解决方案。这个自动化构建…...
Windows 10/11 下保姆级 APK 逆向环境搭建:JDK、APKTool、JADX 一步到位
Windows 10/11 下保姆级 APK 逆向环境搭建:JDK、APKTool、JADX 一步到位 逆向工程是许多安全研究人员和开发者探索应用内部机制的重要技能。对于 Android 应用来说,搭建一个稳定可靠的逆向环境是第一步。本文将详细介绍如何在 Windows 系统上配置完整的…...
ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南
ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows内核模式虚拟控制器驱动&#x…...
别再只扫端口了:利用Google语法精准定位Edusrc等证书站脆弱资产(附实战案例)
别再只扫端口了:利用Google语法精准定位Edusrc等证书站脆弱资产(附实战案例) 在渗透测试的初期阶段,资产搜集的质量往往决定了整个项目的成败。许多安全工程师都曾陷入这样的困境:花费大量时间扫描端口和服务ÿ…...
BGE-Large-Zh在游戏行业的应用:玩家反馈语义分析
BGE-Large-Zh在游戏行业的应用:玩家反馈语义分析 1. 引言 在游戏行业,玩家反馈是宝贵的资源,但面对海量的评论、论坛帖子和客服对话,人工处理往往力不从心。传统的关键词匹配方法只能捕捉表面信息,无法理解玩家真正的…...
