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

【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<基本类型> ...... ) 说明&#xff1a;下标从0开始&#xff0c;越界不报错&#xff0c;以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表&#xff1a; create table arr1(n…...

FIFO架构专题-FIFO是什么

目录 简介&#xff1a; FIFO参数&#xff1a; 1.宽度WIDTH&#xff08;一次位数&#xff09; 2.深度DEEPTH&#xff08;存多少次&#xff09; FIFO的分类&#xff1a; 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...

Pythony——多线程简单爬虫实现

简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表&#xff0c;这里是博客园的分页地址&#xff0c;从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...

如何修改 a 链接的样式

在CSS中&#xff0c;你可以使用选择器来针对HTML中的特定元素&#xff08;例如<a>标签&#xff0c;也就是链接&#xff09;进行修改样式。以下是一些常见的修改<a>链接样式的方法&#xff1a; 移除下划线&#xff1a; a { text-decoration: none; } 修改链接的…...

第6章 详细设计-6.5 软硬件接口文档设计

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

【pyspark学习从入门到精通14】MLlib_1

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

C++全局构造和初始化

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

安全见闻-泷羽sec课程笔记

编程语言 C语言&#xff1a;一种通用的、面向过程的编程语言&#xff0c;广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来&#xff0c;支持面向对象编程&#xff0c;常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言&#xff0c;具有跨平台…...

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …...

【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量化概念与技术细节 题外话&#xff0c;在七八年前&#xff0c;一些关于表征的研究&#xff0c;会去做表征的压缩&#xff0c;比如二进制嵌入这种事情&#xff0c;其实做得很简单&#xff0c;无非是找个阈值&#xff0c;然后将浮点数划归为零一值&#xff0c;现在的Qu…...

同步互斥相关习题10道 附详解

PV操作 2016 某系统允许最多10个进程同时读文件F&#xff0c;当同时读文件F的进程不满10个时&#xff0c;欲读该文件的其他文件可立即读&#xff0c;当已有10个进程在读文件F时读&#xff0c;其他欲读文件F的进程必须等待&#xff0c;直至有进程读完后退出方可去读 在实现管…...

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...

Git 拉取指定分支创建项目

一 背景 因为项目过大&#xff0c;只需要部分分支的代码即可。 二 实现 方法一&#xff1a;使用 --single-branch 参数 git clone 支持只拉取指定分支&#xff0c;而不是整个库的所有分支&#xff1a; git clone --branch <branch_name> --single-branch <reposi…...

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)

思路&#xff1a;一个二分图是由两个集合组成的&#xff0c;同一个集合中的节点间不能连边&#xff0c;所以一个二分图最多有cnt[1]*cnt[2]条边&#xff0c;题目给出一个树的n-1条边&#xff0c;要我们添加最多的边数使他成为二分图&#xff0c;添加的边数就是cnt[1]*cnt[2]-n1…...

React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础

在 React Native 应用中&#xff0c;数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理&#xff0c;包括 React Hooks、Context API 以及第三方状态管理库&#xff08;如 Redux&#xff09;。本章节将详细介绍 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 中&#xff0c;IndexFlatL2 是一个简单的基于 L2 距离&#xff08;欧几里得距离&#xff09;进行索引的索引类型&#xff0c;但实际上&#xff0c;faiss 提供了多种索引类型&#xff0c;支持不同的度量方式和性能优化&#xff0c;您可以根据需求选…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...