FlinkOnYarn 监控 flink任务
Flink任务一般为实时不断运行的任务,如果没有任务监控,
任务异常时无法第一时间处理会比较麻烦。
这里通过调用API接口方式来获取参数,实现任务监控。
Flink任务监控(基于API接口编写shell脚本)
一 flink-on-yarn 模式
二 编写shell 脚本
监控集群指标
http://rm-http-address:port/ws/v1/cluster/metrics
响应正文
<clusterMetrics>
<appsSubmitted>**</appsSubmitted>
<appsCompleted>**</appsCompleted>
<appsPending>0</appsPending>
<appsRunning>**</appsRunning>
<appsFailed>**</appsFailed>
<appsKilled>**</appsKilled>
<reservedMB>0</reservedMB>
<availableMB>**</availableMB>
<allocatedMB>**</allocatedMB>
<pendingMB>0</pendingMB>
<reservedVirtualCores>0</reservedVirtualCores>
<availableVirtualCores>**</availableVirtualCores>
<allocatedVirtualCores>**</allocatedVirtualCores>
<pendingVirtualCores>0</pendingVirtualCores>
<containersAllocated>**</containersAllocated>
<containersReserved>0</containersReserved>
<containersPending>0</containersPending>
<totalMB>**</totalMB>
<totalVirtualCores>**</totalVirtualCores>
<utilizedMBPercent>53</utilizedMBPercent>
<utilizedVirtualCoresPercent>**</utilizedVirtualCoresPercent>
<rmSchedulerBusyPercent>0</rmSchedulerBusyPercent>
<totalNodes>**</totalNodes>
<lostNodes>0</lostNodes>
<unhealthyNodes>**</unhealthyNodes>
<decommissioningNodes>0</decommissioningNodes>
<decommissionedNodes>0</decommissionedNodes>
<rebootedNodes>0</rebootedNodes>
<activeNodes>**</activeNodes>
<shutdownNodes>0</shutdownNodes>
<totalAllocatedContainersAcrossPartition>0</totalAllocatedContainersAcrossPartition>
<crossPartitionMetricsAvailable>false</crossPartitionMetricsAvailable>
</clusterMetrics>
clusterMetrics 对象的元素
| 项目 | 数据类型 | 描述 |
|---|---|---|
| apps已提交 | int | 提交的申请数量 |
| 应用已完成 | int | 完成的申请数量 |
| apps待定 | int | 待处理的申请数量 |
| 应用程序正在运行 | int | 正在运行的应用程序数 |
| apps失败 | int | 失败的应用程序数 |
| 应用已杀死 | int | 被终止的应用程序数 |
| 保留MB | 长 | 预留的内存量(以 MB 为单位) |
| 可用MB | 长 | 可用内存量(以 MB 为单位) |
| 已分配MB | 长 | 分配的内存量(以 MB 为单位) |
| 总MB | 长 | 总内存量(以 MB 为单位) |
| 保留虚拟核心 | 长 | 保留的虚拟核心数 |
| 可用虚拟核心 | 长 | 可用虚拟核心数 |
| 分配的虚拟核心 | 长 | 分配的虚拟核心数 |
| totalVirtualCores 虚拟核心数 | 长 | 虚拟核心总数 |
| 容器已分配 | int | 分配的容器数 |
| 容器保留 | int | 保留的容器数 |
| 容器挂起 | int | 待处理的容器数 |
| 总节点数 | int | 节点总数 |
| 活动节点 | int | 活动节点数 |
| 丢失节点 | int | 丢失的节点数 |
| 不健康的节点 | int | 不正常的节点数 |
| 停用节点 | int | 停用的节点数 |
| 已停用节点 | int | 停用的节点数 |
| rebooted节点 | int | 重新启动的节点数 |
| shutdown节点 | int | 关闭的节点数 |
获取所有application
curl -s http://XXX:8088/ws/v1/cluster/apps
获取 state值为 RUNNING 的application任务
curl -s http://XXX:8088/ws/v1/cluster/apps?state=RUNNING
获取这个任务单个信息
curl -s http://XXX:8088/ws/v1/cluster/apps/application_1619074605427_0063 |jq .app.state
请注意,根据安全设置,用户可能无法看到所有字段。
项目 数据类型 描述 编号 字符串 应用程序 ID 用户 字符串 启动应用程序的用户 名字 字符串 应用程序名称 队列 字符串 提交应用程序的队列 州 字符串 根据 ResourceManager 的应用程序状态 - 有效值是 YarnApplicationState 枚举的成员:NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED finalStatus 字符串 应用程序的最终状态(如果已完成)(由应用程序本身报告)有效值是 FinalApplicationStatus 枚举的成员:UNDEFINED、SUCCEEDED、FAILED、KILLED 进展 浮 以百分比表示的申请进度 trackingUI 字符串 跟踪 URL 当前指向的位置 - 历史记录(用于历史记录服务器)或 ApplicationMaster trackingUrl 字符串 可用于跟踪应用程序的 Web URL 诊断 字符串 详细的诊断信息 clusterId 长 集群 ID 应用程序类型 字符串 应用程序类型 application标签 字符串 应用程序的逗号分隔标记 优先权 字符串 所提交申请的优先权 开始时间 长 应用程序启动的时间(自纪元以来的毫秒) 完成时间 长 应用程序完成的时间(以纪元以来的毫秒数为单位) elapsedTime 长 自应用程序启动以来经过的时间(以毫秒为单位) amContainer日志 字符串 应用程序主容器日志的 URL amHostHttp地址 字符串 应用程序主机的节点 http 地址 amRPCAddress 字符串 应用程序主机的 RPC 地址 已分配MB int 分配给应用程序正在运行的容器的内存总和(以 MB 为单位) 已分配VCores int 分配给应用程序正在运行的容器的虚拟核心的总和 running容器 int 当前为应用程序运行的容器数 memorySeconds 长 应用程序分配的内存量(兆字节-秒) vcore秒数 长 应用程序分配的 CPU 资源量(虚拟内核 - 秒) queueUsagePercentage 浮 应用正在使用的队列资源的百分比 clusterUsage百分比 浮 应用正在使用的群集资源的百分比。 抢占ResourceMB 长 抢占式容器使用的内存 preemptedResourceVCores 长 抢占容器使用的虚拟核心数 numNonAMContainer抢占 int 抢占的标准容器数 numAMContainer抢占 int 抢占的应用程序主容器数 logAggregationStatus 字符串 日志聚合的状态 - 有效值是 LogAggregationStatus 枚举的成员:DISABLED、NOT_START、RUNNING、RUNNING_WITH_FAILURE、SUCCEEDED、FAILED、TIME_OUT unmanaged应用程序 布尔 应用程序是否处于非托管状态。 appNodeLabelExpression 字符串 节点标签表达式,用于标识默认情况下应在其上运行应用程序容器的节点。 amNodeLabel表达式 字符串 节点标签表达式,用于标识应用程序的 AM 容器预期在其上运行的节点。
jq,是linux一个很方便的json处理工具
通俗的说就是一个能够接受json,处理json,输出json的程序,反正很好用。
安装起来也非常的方便,直接使用yum即可安装。linux下离线安装jq工具 - 代码天地 (codetd.com)
yum install jq
编写shell脚本
由于公司离线yarn和实时yarn 采用是分开的方式。
只需要监控实时yarn 任务有没有处于RUNNING,达到监控的目的
这里shell脚本也只记录,flink-on-yarn 这种部署方式任务监控
shell脚本水平有限,大家多多谅解,欢迎指导shell脚本实现功能:
获取线运行job任务,记录到日志文件。下一次脚本调用时候读取日志文件,判断状态。
不是RUNNING,就告警同时重新记录日志。
#!/bin/bashJoblist=`cat /opt/shell/logs/flink_job.log` #获取记录job的log文件
let i=0 #获取任务数
let log_count=0 #获取日志中的任务数
start_count=RUNNING #判断任务是否存在异常############## 1 判断日志文件内容是否为空,为空时自动读取flink任务并记录到日志文件 #########
if [ -z "$Joblist" ]
thenwhile :dojob_id[$i]=`curl -s http://XXX:8088/ws/v1/cluster/apps?state=RUNNING |jq .apps.app[$i].id`if [ ${job_id[$i]} = "null" ];thenbreakelseecho ${job_id[$i]}echo ${job_id[$i]}>>/opt/shell/logs/flink_job.loglet i++fidone
fi############## 2 读取文件中JOB任务 ##################let i=0
while read line
doJOB[$i]=$linelet i++
done</opt/shell/logs/flink_job.loglog_count=$i #获取日志中的任务数########### 3 判断任务状态,是否为RUNNIG,不是则邮件告警 ###############
for ((j=0;j<i;j++))
doJOB_ID=${JOB[$j]//\"}JOB_status=`curl -s http://XXXX:8088/ws/v1/cluster/apps/$JOB_ID | jq .app.state`JOB_NAME=`curl -s http://XXX:8088/ws/v1/cluster/apps/$JOB_ID | jq .app.name`START=$[`curl -s http://XXX:8088/ws/v1/cluster/apps/$JOB_ID | jq .app.startedTime` / 1000]# echo "JOB_NAME: "$JOB_NAME
# echo 启动时间: `date -d @$START +"%F %H:%M:%S"`
# echo "JOB_status: " ${JOB_status//\"}#echo -e "【$JOB_NAME】 \n JOB_ID: $JOB_ID \n 启动时间: `date -d @$START +"%F %H:%M:%S"` \n 检查时间: `date "+%Y-%m-%d %H:%M:%S"` \n 目前状态: $JOB_status"
#echo "=============================================="if [ ${JOB_status//\"} != "RUNNING" ];thenSUBJECT="【异常告警】Flink任务异常"TEXT="Flink任务 【$JOB_NAME】 异常故障 \n\nJOB_ID: $JOB_ID\n\n启动时间: `date -d @$START +"%F %H:%M:%S"` \n\n检查时间: `date "+%Y-%m-%d %H:%M:%S"` \n\n目前状态: $JOB_status"echo -e $TEXT | mail -s $SUBJECT 邮箱地址start_count=erronfi
done########### 4 出现任务异常,重新读取job 任务记录到日志文件 ###############let i=0
if [ $start_count == "erron" ];thenecho '重新写入日志文件'while :dojob_id[$i]=`curl -s http://XXXX:8088/ws/v1/cluster/apps?state=RUNNING |jq .apps.app[$i].id`if [ ${job_id[$i]} = "null" ];thenbreakelif [ $i == 0 ]; thenecho ${job_id[$i]}>/opt/shell/logs/flink_job.logelseecho ${job_id[$i]}>>/opt/shell/logs/flink_job.logfilet i++donestart_count=RUNNING
fi########### 5 判断线上任务数是否一致,是否有新任务增加 ###############let i=0
while :
dojob_id[$i]=`curl -s http://XXX:8088/ws/v1/cluster/apps?state=RUNNING |jq .apps.app[$i].id`if [ ${job_id[$i]} = "null" ];thenbreakelselet i++fi
done
let count=$i #线上任务数
echo "==========================线上最新RUNNING状态任务数: "$count
echo "==========================日志RUNNING状态任务数: "$log_countif [ ! $count -eq $log_count ]; thenecho "现有RUNNING状态任务数不相等于已记录的任务数"echo ${job_id[0]} >/opt/shell/logs/flink_job.logfor ((i=1;i<count;i++))doecho "重新写入JOB: "${job_id[$i]}echo ${job_id[$i]}>> /opt/shell/logs/flink_job.logdonefiecho "======================当前时间: `date "+%Y-%m-%d %H:%M:%S"`======================================="
echo ================================================================================================
echo =====================================本次crontab监控结束========================================
echo ================================================================================================
Yarn REST API 使用指南-阿里云开发者社区
Apache Hadoop 3.0.1 – ResourceManager REST API。
相关文章:
FlinkOnYarn 监控 flink任务
Flink任务一般为实时不断运行的任务,如果没有任务监控, 任务异常时无法第一时间处理会比较麻烦。 这里通过调用API接口方式来获取参数,实现任务监控。 Flink任务监控(基于API接口编写shell脚本) 一 flink-on-yarn 模式 二 编写she…...
C++内存管理机制(侯捷)笔记1
C内存管理机制(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 第一讲primitives的笔记 截至…...
【论文阅读】Non-blocking Lazy Schema Changes in Multi-Version
Non-blocking Lazy Schema Changes in Multi-Version Database Management Systems 1. Intro 1.1 Motivation 一个是online能够提供不停机的更新的能力,在很多业务系统里面是必要的。第二个是满足高可用,SaaS、PaaS要提供高可用的系统给用户ÿ…...
Rust 最新版1.75.0升级记
升级方法 稳定版 C:\>rustup update stable info: syncing channel updates for stable-x86_64-pc-windows-msvc info: latest update on 2023-12-28, rust version 1.75.0 (82e1608df 2023-12-21) info: downloading component cargo 5.9 MiB / 5.9 MiB (100 %) 3.…...
使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统
极狐GitLab 简介 极狐GitLab 是一个一体化的 DevOps 平台,可以简单理解为 GitLab 在国内的“发行版”。是由极狐(GitLab)公司推出的产品(极狐(GitLab)公司是以“中外合资3.0”模式成立的公司,在国内独立运营,为国内用户提供适合本…...
EasyExcel的追加写入(新增POI、CSV)
总结:目前市面上流行的2种 EasyExcel和POI都不是真正的对物理excel文件进行追加导入。只是在缓存里面追加,最后一次性写入,并不能解决内存占用问题。 1.EasyExcel2.POI3.CSV 无非就是下面两种逻辑: 1.for循环查询数据,…...
JetBrains 开发工具——免费教育许可申请流程
JetBrains 开发工具——免费教育许可申请流程 本文将详细介绍通过教育邮箱申请Free Educational Licenses. Free Educational Licenses地址 1.选择符合自己的申请入口 2.填写申请表单提交 官方指南 😃😃😃...
打造高性价比小程序,轻松降低成本
随着移动互联网的普及,小程序已经成为一个热门的应用开发方向。然而,对于许多企业和个人而言,制作一个小程序的费用却让人望而却步。那么,如何以最低的成本制作一款高性价比的小程序呢? 答案很简单,只需要找…...
mysql 索引优化查询
MySQL的索引可以提高数据库查询性能。下面是一些常用的MySQL索引优化技巧: 创建合适的索引:根据查询条件选择合适的列作为索引,并确保这些索引在WHERE子句中被使用到。 示例代码:CREATE INDEX idx_name ON table_name (column_nam…...
跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置
引入GLFW: 在vendor里创建GLFW文件夹: 在github上下载,把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置:12、13、15、36…...
Tomcat基础升华学习
01 What is Tomcat 1.1 Tomcat官网 官网 :https://tomcat.apache.org 1.2 Understand 为什么说Tomcat是Servlet之类技术的实现? 在我们的理解中,Tomcat可以称为Web容器或者Servlet容器 不妨通过手写一个Tomcat来推导一下 1.2.1 创建Tomc…...
一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读
论文题目:A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化,然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…...
GPDB - 高可用 - 流复制状态
GPDB - 高可用 - 流复制状态 GPDB的高可用基于流复制,通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL 1、WalSndState typedef enum WalSndState {WALSNDSTATE…...
最佳解决方案:如何在网络爬虫中解决验证码
Captcha(全自动区分计算机和人类的公开图灵测试)是广泛应用的安全措施,用于区分合法的人类用户和自动化机器人。它通过呈现复杂的挑战,包括视觉上扭曲的文本、复杂的图像或复杂的拼图等方式,要求用户成功解决这些挑战以…...
在线项目实习分享:股票价格形态聚类与收益分析
01前置课程 数据挖掘基础数据探索数据预处理数据挖掘算法基础Python数据挖掘编程基础Matplotlib可视化Pyecharts绘图 02师傅带练 行业联动与轮动分析 通过分析申银万国行业交易指数的联动与轮动现象,获得有意义的行业轮动关联规则,并在此基础上设计量…...
c# vb.net检测字符串是否匹配一组相似度数组input Like
VB.NET 检测字符串是否符合一个数组中的多个like条件,有没有最简单的函数? 在VB.NET中,可以使用Array.Exists方法结合String.Like方法来检测一个字符串是否符合一个数组中的多个LIKE条件。Array.Exists方法用于确定序列中的任何元素是否满足…...
DEJA_VU3D - Cesium功能集 之 113-获取圆节点(2)
前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...
spring-boot项目启动类错误: 找不到或无法加载主类 com.**Application
问题:Springboot项目启动报错:错误: 找不到或无法加载主类 com.**Application 解决步骤: 1.File–>Project Structure 2.Modules–>选中你的项目–点击“-”移除 3.重新导入:点击“”号,选择Import Module&…...
搭建大数据开发环境【AutoDL容器】
租用AutoDL容器 注意:结束实验时记得将数据库数据转移存储 使用Docker实现本地IDEA连接AutoDL 后为ssh服务器地址用户名为前的端口号ssh密码为用户密码 安装JDK 压缩包安装 Java下载地址:Oracle Java Download(hadoop不指定特定版本java&…...
写一个简单的Java的Gui文本输入窗口,JFrame的简单使用
JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 Swing的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
