当前位置: 首页 > 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;您可以根据需求选…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...