大数据多集群数据作业和集群状态监控

目前手里面有四套大数据集群的作业需要维护,分别属于不同的客户,我同岗位的兄弟离职后,所有的数据作业都落到我头上了,公司也不招人了。开发新的数据作业倒没有什么问题,就是客户叫我补数的时候,头比较大,当天的直接重跑就是了,尤其是要补很久以前的数据,还要去查看代码,找出作业之间的依赖。调度平台也不尽相同。如果能提前发现问题,当天问题当天解决,客户不找我补数,那不是有更多的时间摸鱼啦?

1.需要监控的组件盘点

针对Apache 原生部署的集群,重点监控对象 hdfs yarn ,挂的概率最大就是这两大组件,然后就是kafka、 zookeeper、Azkaban,这三个组件的监控比较简单,主要监听程序端口是否开启。针对cdh集群设置组件故障重启,利用cdh数据库监听集群组件状态。所有集群监听yarn上运行的作业。监控程序语言选择java,之前用python写过一些简单的监控程序,但是部署实在是很麻烦。

2.Hdfs 监控

主要是监控 namenode 、datanode 以及hdfs使用情况。 这里主要是用hadoop的api实现的。

public static String hdfsCheck() throws IOException{Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://xxxxx:9820"); //  Namenode 地址和端口// 创建 HdfsAdmin 实例DistributedFileSystem dfs;try {dfs = (DistributedFileSystem) FileSystem.get(conf);dfs.getServerDefaults().getReplication();}catch (Exception e){conf.set("fs.defaultFS", "hdfs://XXXX:9820"); //  HA Namenode 地址和端口dfs = (DistributedFileSystem) FileSystem.get(conf);}String warn = "";try {// 创建 HDFS 文件系统实例if (dfs.isInSafeMode()) {warn = "namenode is in safe mode";}long totalCapacity = dfs.getStatus().getCapacity(); // 总容量long usedCapacity = dfs.getStatus().getUsed();     // 已用容量long remainingCapacity = dfs.getStatus().getRemaining(); // 可用容量double usagePercentage = (double) usedCapacity / totalCapacity * 100;// 将字节转换为吉字节double totalCapacityGB = totalCapacity / (1024.0 * 1024 * 1024);double usedCapacityGB = usedCapacity / (1024.0 * 1024 * 1024);double remainingCapacityGB = remainingCapacity / (1024.0 * 1024 * 1024);// 输出容量信息log.info(String.format("Total Capacity: %.2f GB", totalCapacityGB));log.info(String.format("Used Capacity: %.2f GB", usedCapacityGB));log.info(String.format("Remaining Capacity: %.2f GB", remainingCapacityGB));log.info(String.format("Usage Percentage: %.2f%%", usagePercentage));// 检查使用率是否超过 90%if (usagePercentage > 90) {warn=warn+"Warning: HDFS usage exceeds 90%!";}// 检查使用率是否超过 90%if (usagePercentage > 90) {System.out.println("Warning: HDFS usage exceeds 90%!");}// 获取 Datanode 信息DatanodeInfo[] datanodes = dfs.getDataNodeStats();// 获取 Datanode 状态long currentTime = System.currentTimeMillis();int liveNodesCount = 0;// 假设心跳阈值为5分钟long heartBeatThreshold = 5 * 60 * 1000;for (DatanodeInfo datanode : datanodes) {long heartBeatTime = datanode.getLastUpdate();if (currentTime - heartBeatTime <= heartBeatThreshold) {liveNodesCount++;}else {warn=warn+"datanode: "+datanode.getHostName()+" is not alive\n";}}log.info("Number of live nodes: " + liveNodesCount);return warn;} catch (IOException e) {warn=warn+"hdfs is not available";return warn;}
}

3.yarn监控

主要是监控 resourcemanager、NodeManager, 这里主要是用yarn的api实现的。

public static boolean isPortOpen(String host, int port) {try (Socket socket = new Socket()) {socket.connect(new java.net.InetSocketAddress(host, port), 2000); // 设置超时时间为2000毫秒return true; // 连接成功,端口开放} catch (IOException e) {return false; // 连接失败,端口关闭}
}public static String yarnCheck() {// YARN ResourceManager 地址String resourceManagerHost = "XXXXX"; //  ResourceManager 地址int resourceManagerPort = 8032; //  ResourceManager 端口if(!isPortOpen(resourceManagerHost, resourceManagerPort)){  // 判断端口是否通return "yarn resourcemanager is not available";}String warn="";//如果集群有HA resourcemanager 需要像hdfs那样判断一下。// 创建 YARN 客户端Configuration conf = new Configuration();conf.set("yarn.resourcemanager.address", resourceManagerHost + ":" + resourceManagerPort);try (YarnClient yarnClient = YarnClient.createYarnClient()) {yarnClient.init(conf);yarnClient.start();List<NodeReport> nodeReports = yarnClient.getNodeReports();long currentTime = System.currentTimeMillis();int liveNodesCount = 0;long heartBeatThreshold = 5 * 60 * 1000;  // 设置心跳间隔,大于这个间隔默认挂掉for (NodeReport nodeReport : nodeReports) {long heartBeatTime = nodeReport.getLastHealthReportTime();if (currentTime - heartBeatTime <= heartBeatThreshold) {liveNodesCount++;}else {warn= warn+"NodeManager: "+nodeReport.getNodeId()+" is not alive\n";}}log.info("Number of live yarn NodeManager: " + liveNodesCount);return warn;} catch (Exception e) {e.printStackTrace();}return warn;
}

4.yarnjob监控

监控指定指定时间的job是否运行成功,我们这边大部分作业都是spark job,提交的时候都有job名,不是hive sql提交的,所以一旦找到出错的job名,就能快定位故障,从而实现开始补数。

private static Long extractNumber(String s) { //用于 application id 排序String[] split = s.split("_");String numberPart = split[1]+split[2]; // 替换非数字字符return numberPart.isEmpty() ? 0 : Long.parseLong(numberPart); // 转换为整数
}public static String yarnJobCheck(String date) throws IOException, YarnException {// YARN ResourceManager 地址System.setProperty("HADOOP_USER_NAME", "xxxx"); // 有些集群hdfs会限制用户String resourceManagerHost = "XXXX"; //  ResourceManager 地址int resourceManagerPort = 8032; // ResourceManager 端口if (!isPortOpen(resourceManagerHost, resourceManagerPort)) {return "yarn resourcemanager is not available";}String warn = "";// 创建 YARN 客户端Configuration conf = new Configuration();conf.set("yarn.resourcemanager.address", resourceManagerHost + ":" + resourceManagerPort);try (YarnClient yarnClient = YarnClient.createYarnClient()) {yarnClient.init(conf);yarnClient.start();conf.set("fs.defaultFS", "hdfs://XXX:8020"); // Namenode 地址和端口// 创建 HdfsAdmin 实例DistributedFileSystem dfs;try {dfs = (DistributedFileSystem) FileSystem.get(conf);dfs.getServerDefaults().getReplication();} catch (Exception e) {conf.set("fs.defaultFS", "hdfs://XXX:8020");  // HA Namenode 地址和端口dfs = (DistributedFileSystem) FileSystem.get(conf);}Path path = new Path("/yarn/application/XXX/logs/"); // hdfs 上存储日子的目录FileStatus[] fileStatusList = dfs.listStatus(path);ArrayList<String> appIdList = new ArrayList<>();// 遍历并打印文件名for (FileStatus fileStatus : fileStatusList) {if (fileStatus.isDirectory()) { // 确保是文件而不是目录java.util.Date finishTime = new Date(fileStatus.getModificationTime());LocalDate finishDate = finishTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();if ((finishDate.toString()).equals(date)) { // 获取指定日期的application idappIdList.add(fileStatus.getPath().getName());}}}// 根据字符串中的数字对appid进行排序Collections.sort(appIdList, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {Long num1 = extractNumber(s1);Long num2 = extractNumber(s2);return Long.compare(num1, num2);}});HashMap<String, String> appNameMap = new HashMap<>();// 各个名字的job只取最新的那一个for (String appId : appIdList) {ApplicationReport applicationReport = yarnClient.getApplicationReport(ApplicationId.fromString(appId));appNameMap.put(applicationReport.getName(),appId);}for(String appName:appNameMap.keySet()){ApplicationReport applicationReport = yarnClient.getApplicationReport(ApplicationId.fromString(appNameMap.get(appName)));String diagnostics = applicationReport.getDiagnostics();//筛选指定的故障的jobif (!diagnostics.isEmpty()&&(applicationReport.getName().contains("Interface")||applicationReport.getName().contains("Report"))){warn=warn+""+"Job finish date :"+stampToDate(Long.valueOf(applicationReport.getFinishTime()))+"\n"+"job name:"+applicationReport.getName()+"\n"+"job id:"+applicationReport.getApplicationId()+"\n";}if(applicationReport.getName().contains("Report")||applicationReport.getName().contains("Interface")){log.info(String.format("app finish time: %s", stampToDate(Long.valueOf(applicationReport.getFinishTime()))));log.info(String.format("Application ID: %s", ApplicationId.fromString(appNameMap.get(appName))));log.info(String.format("Application Name: %s", applicationReport.getName()));log.info(String.format("Application State: %s", applicationReport.getYarnApplicationState()));log.info(String.format("Final Status: %s", applicationReport.getFinalApplicationStatus()));log.info("================================================");}}}return warn;
}

5.部署jar包

我是部署到自己工作的电脑上,工作的电脑能访问各个集群的服务器,设置定时每天发几次邮件给我。知道现在集群的现状,如果有问题及时干预,客户不找我补数,日子美滋滋撒。
定时设置:
在这里插入图片描述
邮件样例:
在这里插入图片描述
最后,欢迎大家关注我的公众号:造轮子的坦克,可以通过公众号联系我。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540221.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础权限

Linux基础权限 shell的概念Linux基础权限Linux的两种用户Linux的权限管理权限认知权限设置权限掩码粘滞位 shell的概念 &#xff08;shell&#xff09;命令行解释器 的存在意义&#xff1a; 将用户的命令翻译给操作系统&#xff0c;然后返回OS的结果给用户&#xff1b;保护OS…

YOLOv5图像识别教程包成功-以识别桥墩缺陷详细步骤分享

前置环境资源下载 提示&#xff1a;要开外网才能下载的环境我都放在了网盘里&#xff0c;教程中用到的环境可从这里一并下载&#xff1a; https://pan.quark.cn/s/f0c36aa1ef60 1. 下载YOLOv5源码 官方地址&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; …

9.4 溪降技术:带包下降

目录 9.4 携包下降概述观看视频课程电子书&#xff1a;携包下降在瀑布中管理背包扔背包滑索传送背包固定到安全带 V7 提示&#xff1a;将背包固定到安全带总结 9.4 携包下降 概述 在水流和悬崖边缘携包下降是最危险的情况&#xff01; 正如我们之前所学&#xff0c;在峡谷探险中…

流程型制造业MES系统的特点及主要功能介绍

流程型MES系统的应用程度较高。特别是石油石化行业原有自动化和信息化的程度较高&#xff0c;一般应用在于生产管控&#xff0c;mes系统的应用主要目的是使得最容易出现产品质量的配料、投料以及乳化加工过程得到管控和追溯。 随着生产工艺发展&#xff0c;石化行业MES系统应用…

Java基础(中)

面向对象基础 面向对象和面向过程的区别 面向过程编程&#xff08;Procedural-Oriented Programming&#xff0c;POP&#xff09;和面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是两种常见的编程范式&#xff0c;两者的主要区别在于解决…

Java设计模式——工厂方法模式(完整详解,附有代码+案例)

文章目录 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现 5.3 工厂方法模式 针对5.2.3中的缺点&#xff0c;使用工厂方法模式就可以完美的解决&#xff0c;完全遵循开闭原则。 5.3.1概述 工厂方法模式&#xff1a;定义一个创建对象的接口&#xff08;这里的接口指的是工厂&…

逆向中巧遇MISC图片隐藏

这道题比较有意思&#xff0c;而且因为我对misc并不是很熟悉&#xff0c;发现该题目将flag隐藏在图片的颜色属性&#xff0c;巧妙的跟踪到这些密文位置&#xff0c;拿下题目一血&#xff0c;还是很有参考学习意义的。&#xff08;题目附件&#xff0c;私信发。&#xff09; 1、…

openstack 2023.2 Bobcat 本地安装部署

一、系统环境 rootodoo16e-server:~# cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE22.04 DISTRIB_CODENAMEjammy DISTRIB_DESCRIPTION"Ubuntu 22.04.5 LTS"rootodoo16e-server:~# python3 --version Python 3.10.12rootodoo16e-server:~# pip --version …

基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)

本文主要内容:详细介绍了无人机航拍输电线瓷瓶检测的整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 输电线路绝缘瓷瓶的检测主要依赖人工巡检。巡检人员需携带专业设备&#xff0c;攀…

亿级数据表多线程update锁表问题

目录 1、问题描述 2、原因分析 3、问题解决 1、问题描述 在pg数据库&#xff0c;某个业务&#xff0c;有一张数据表test&#xff0c;数据表结果如下&#xff1a; test(sjjbh,wlbid,gzmb,sfzg,zgsj,cjsj,xx...)&#xff0c;这个表没有主键&#xff0c;会有很多重复数据。 tes…

Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

报错 vue-project0.0.0 dev vite‘vite’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。解决 第1步. 控制台输入 npm install -g create-vite第2步. 控制台输入 npm install -g vite第3步. 运行就ok啦

【HTTP】方法(method)以及 GET 和 POST 的区别

文章目录 方法&#xff08;method&#xff09;登录上传GET 和 POST 有什么区别&#xff08;面试&#xff09;区别不准确的说法 方法&#xff08;method&#xff09; 首行中的第一部分。首行是由方法、URL 和版本号组成 方法描述了这次请求想干什么&#xff0c;最主要的是&…

13 vue3之内置组件keep-alive

内置组件keep-alive 有时候我们不希望组件被重新渲染影响使用体验&#xff1b;或者处于性能考虑&#xff0c;避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。 开启keep-alive 生命周期的变化 初次进入时&#xff1a;…

基于SpringBoot+Vue的私人牙科诊所管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

MySQL函数介绍--日期与时间函数(一)

我相信大家在学习各种语言的时候或多或少听过我们函数或者方法这一类的名词&#xff0c;函数在计算机语言的使用中可以说是贯穿始终&#xff0c;那么大家有没有思考过到底函数是什么&#xff1f;函数的作用又是什么呢&#xff1f;我们为什么要使用函数&#xff1f;其实&#xf…

模型案例:| 篮球识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

CANopen开源库canfestival的移植

本文记录将CANopen开源库CANfestival移植到GD32F470单片机的过程。CANopen协议理解请参考博客&#xff1a;CANopen协议的理解-CSDN博客 CANfestival开源库下载链接 CSDN链接&#xff1a; https://download.csdn.net/download/heqiunong/89774627 官网链接&#xff1a;https:/…

HTML常见语法设计

HTML常见语法设计 1.HTML类和ID类id 2.HTML 响应式 Web 设计3.HTML5 语义元素4.HTML 字符实体5.HTML 编码&#xff08;字符集&#xff09; 1.HTML类和ID 类 对 HTML 进行分类&#xff08;设置类&#xff09;&#xff0c;使我们能够为元素的类定义 CSS 样式。为相同的类设置相…

耐高温滑环的应用场景及市场前景分析

耐高温滑环是一种重要的电气连接装置&#xff0c;广泛应用于需要传递电力和信号的旋转设备中。随着工业技术的发展&#xff0c;对耐高温滑环的需求不断增加&#xff0c;尤其是在极端温度环境下的应用场合&#xff0c;耐高温滑环展现出其独特的优势。 耐高温滑环在工业自动化领…

第157天: 安全开发-Python 自动化挖掘项目SRC 目标FOFA 资产Web 爬虫解析库

案例一&#xff1a;Python-WEB 爬虫库&数据解析库 这里开发的内容不做过多描述&#xff0c;贴上自己写的代码 爬取数据 要爬取p标签&#xff0c;利用Beautyfulsoup模块 import requests,time from bs4 import BeautifulSoup#url"https://src.sjtu.edu.cn/rank/firm…