【Hive实战】HiveMetaStore的指标采集告警

HiveMetaStore的指标采集告警

文章目录

  • HiveMetaStore的指标采集告警
    • 背景
      • 部署概要图
    • 开启HiveMetaStore的JMX指标采集(Hadoop2指标系统)
    • 指标监控
      • 查询指标
      • 核心指标选择
      • 告警
    • 遗留问题

背景

在远程模式的Metastore下,对其开启Hadoop2指标采集以及JMX的对外接口。通过单独的程序请求JMX,获取hive的基础指标信息。对核心指标进行阈值告警。

部署概要图

JVM2
JVM1
HiveServer2服务组
Metastore
Metastore
HiveServer2
HiveServer2
Mysql服务组
client

开启HiveMetaStore的JMX指标采集(Hadoop2指标系统)

  1. hive-site.xml 变更配置

    <!--开启metastore的指标子服务-->
    <property>
        <name>hive.metastore.metrics.enabled</name>
        <value>true</value>
    </property>
    
    <!--指标的输出类型-->
    <property>
        <name>hive.service.metrics.reporter</name>
        <value>JMX,HADOOP2</value>
    </property>
    
    <!--指标输出Hadoop2指标系统的名称-->
    <property>
        <name>hive.service.metrics.hadoop2.component</name>
        <value>hivemetastore</value>
    </property>
    
    <!--指标输出Hadoop2指标系统的周期-->
    <property>
        <name>hive.service.metrics.hadoop2.frequency</name>
        <value>30s</value>
    </property>
    
  2. 修改~/hive/bin/hive文件

    for j in $SERVICE_LIST ; do
      if [ "$j" = "$SERVICE" ] ; then
    
    ## >>>>>> 增加的部分-开始 >>>>>> 
     if [ "$SERVICE" = "hiveserver2" ] ; then
          export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -XX:NewSize=1024m -XX:MaxNewSize=1024m -Xms5120m -Xmx5120m -XX:PermSize=100m"
        elif [ "$SERVICE" = "metastore" ] ; then
          export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -XX:+PrintCommandLineFlags -XX:NewSize=2g -XX:MaxNewSize=2g -Xms4g -Xmx4g -XX:PermSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -verbose:gc -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintPromotionFailure -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=512M -Xloggc:/opt/hive/logs/gc-metastore.log -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9082"
        fi
    ## <<<<<< 增加的部分-结束 <<<<<<  
    
        TORUN=${j}$HELP
      fi
    done
    

    jmxremote的端口不能被其他服务占用。

    netstat -tuln | grep 9082
    
  3. 修改/hadoop-2.9.1.1/etc/hadoop/hadoop-env.sh

    export HADOOP_CLIENT_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR $HADOOP_CLIENT_OPTS"
    
  4. 启动

    进入到hive目录后

    nohup hive --service metastore >>/opt/hive/logs/metastore.log 2>&1 &
    

指标监控

在华佗web中增加针对HiveMetaStore的监控任务,对每一台HiveMetaStore的指标进行采集与告警。

JVM2
JVM1
Web
告警
Metastore
Metastore
MetastoreMetricsMonitor
告警服务号

查询指标

import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class HiveMetaStoreMetric {


    public static void main(String[] args) throws IOException, MalformedObjectNameException, ReflectionException, InstanceNotFoundException, IntrospectionException, AttributeNotFoundException, MBeanException {
        // MetaStore的JMX连接地址
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.1.1:9082/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

        // 查询Hadoop2指标下的hivemetastore
        ObjectName query = new ObjectName("Hadoop:service=hivemetastore,name=hivemetastore");
        MBeanInfo minfo = mbsc.getMBeanInfo(query);
        MBeanAttributeInfo[] beanAttributeInfos = minfo.getAttributes();
        // 遍历指标
        Object value;
        for (MBeanAttributeInfo attributeInfo : beanAttributeInfos) {
            value = mbsc.getAttribute(query, attributeInfo.getName());
            // 不同指标项的值属性不同
            if (value instanceof Long) {
                Long l = (Long) value;
                System.out.println(attributeInfo.getName() + " " + value);
            } else if (value instanceof Double) {
                Double d = (Double) value;
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, RoundingMode.HALF_UP).doubleValue();
                System.out.println(attributeInfo.getName() + " " + f1);
            } else if (value instanceof Integer) {
                Integer i = (Integer) value;
                System.out.println(attributeInfo.getName() + " " + value);
            } else {
                System.out.println(attributeInfo.getName() + " " + value);
            }
        }
        // 关闭连接
        jmxc.close();
    }
}

结果示例

tag.rate_unit events/second
tag.duration_unit milliseconds
tag.Hostname bdsitapp255
buffers.direct.capacity 0
buffers.direct.count 0
buffers.direct.used 0
buffers.mapped.capacity 0
buffers.mapped.count 0
buffers.mapped.used 0
classLoading.loaded 7219
classLoading.unloaded 0
gc.ConcurrentMarkSweep.count 1
gc.ConcurrentMarkSweep.time 146
gc.ParNew.count 75
gc.ParNew.time 1065
init_total_count_dbs 489
init_total_count_partitions 51089
init_total_count_tables 13733
memory.heap.committed 4080271360
memory.heap.init 4294967296
memory.heap.max 4080271360
memory.heap.usage 0.06
memory.heap.used 236619048
memory.non-heap.committed 79024128
memory.non-heap.init 2555904
memory.non-heap.max -1
memory.non-heap.usage -7.7437264E7
memory.non-heap.used 77437264
memory.pools.CMS-Old-Gen.usage 0.01
memory.pools.Code-Cache.usage 0.09
memory.pools.Compressed-Class-Space.usage 0.0
memory.pools.Metaspace.usage 0.98
memory.pools.Par-Eden-Space.usage 0.13
memory.pools.Par-Survivor-Space.usage 0.01
memory.total.committed 4159295488
memory.total.init 4297523200
memory.total.max 4080271359
memory.total.used 314056312
threads.blocked.count 0
threads.count 223
threads.daemon.count 22
threads.deadlock.count 0
threads.new.count 0
threads.runnable.count 8
threads.terminated.count 0
threads.timed_waiting.count 9
threads.waiting.count 206
active_calls_api_get_database 0
active_calls_api_get_tables 0
active_calls_api_init 0
active_calls_api_set_ugi 0
jvm.pause.extraSleepTime 240
open_connections 1
api_get_database_count 10446
api_get_database_mean_rate 0.02
api_get_database_1min_rate 0.01
api_get_database_5min_rate 0.02
api_get_database_15min_rate 0.02
api_get_database_mean 9.24
api_get_database_min 8.45
api_get_database_max 13.3
api_get_database_median 9.23
api_get_database_stddev 0.63
api_get_database_75thpercentile 9.95
api_get_database_95thpercentile 10.1
api_get_database_98thpercentile 10.1
api_get_database_99thpercentile 10.1
api_get_database_999thpercentile 10.1
api_get_tables_count 3482
api_get_tables_mean_rate 0.01
api_get_tables_1min_rate 0.0
api_get_tables_5min_rate 0.01
api_get_tables_15min_rate 0.01
api_get_tables_mean 7.76
api_get_tables_min 7.31
api_get_tables_max 9.18
api_get_tables_median 7.79
api_get_tables_stddev 0.04
api_get_tables_75thpercentile 7.79
api_get_tables_95thpercentile 7.79
api_get_tables_98thpercentile 7.79
api_get_tables_99thpercentile 7.89
api_get_tables_999thpercentile 8.0
api_init_count 1
api_init_mean_rate 0.0
api_init_1min_rate 0.0
api_init_5min_rate 0.0
api_init_15min_rate 0.0
api_init_mean 3519.03
api_init_min 3519.03
api_init_max 3519.03
api_init_median 3519.03
api_init_stddev 0.0
api_init_75thpercentile 3519.03
api_init_95thpercentile 3519.03
api_init_98thpercentile 3519.03
api_init_99thpercentile 3519.03
api_init_999thpercentile 3519.03
api_set_ugi_count 1
api_set_ugi_mean_rate 0.0
api_set_ugi_1min_rate 0.0
api_set_ugi_5min_rate 0.0
api_set_ugi_15min_rate 0.0
api_set_ugi_mean 0.26
api_set_ugi_min 0.26
api_set_ugi_max 0.26
api_set_ugi_median 0.26
api_set_ugi_stddev 0.0
api_set_ugi_75thpercentile 0.26
api_set_ugi_95thpercentile 0.26
api_set_ugi_98thpercentile 0.26
api_set_ugi_99thpercentile 0.26
api_set_ugi_999thpercentile 0.26

核心指标选择

  • gc.ParNew.count :新生代发生GC的次数,算平均GC耗时
  • gc.ParNew.time :新生代发生GC的总耗时,单位ms,算平均GC耗时
  • memory.heap.usage:堆内存使用占比
  • open_connections:当前打开的连接数
  • active_calls_api_create_table:当前创建表的请求数
  • active_calls_api_drop_table:当前删除表的请求数
  • active_calls_api_alter_table:当前变更表的请求数
  • api_get_tables_mean:get_tables的平均请求时间,ms
  • api_get_database_mean:get_database的平均请求时间,ms
  • api_get_table_mean:get_table的平均请求时间,ms
  • api_get_databases_mean:get_databases的平均请求时间,ms
  • api_get_multi_table_mean:get multi table的平均请求时间,ms

告警

可以针对以上指标在SCM上配置告警阈值,控制指标异常告警。

告警时间:2024-04-20 20:40:00
级别:严重
环境:PRD
事件标识:HiveMetaStore-Metris-open_connections-192.168.1.1
告警内容:
  [2024-04-20 20:49:10] HiveMetaStore节点(192.168.1.1)指标open_connections(1000)异常。
  [2024-04-20 20:39:10] HiveMetaStore节点(192.168.1.1)指标open_connections(1002)异常。
事件数量:2

遗留问题

  1. 实际PRD的指标项会比示例中的指标项多,全部的指标数据是否需要存储?如果要存储,则存储介质选择什么?

    先临时计算指标报文的大小,直接输出在日志文件中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域&#xff0c;以下是其中几个最新的应用&#xff1a; 1、自动驾驶汽车&#xff1a;自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化&#xff0c;帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…

利用git将Qt代码托管到U盘或者网盘

文章目录 1.前言2.解决方案3.操作步骤3.1.软件安装3.2.在U盘创建裸仓库3.3.创建Qt程序并将代码上传至U盘3.4.版本标记及切换3.4.在别的电脑上clone代码出来 4.其他5.结语 1.前言 我们在开发项目时&#xff0c;随着项目需求的增加以及bug的修复&#xff0c;肯定会涉及到版本管理…

【山东大学】web数据管理——复习笔记

写在前面 若有图片加载失败&#xff0c;请科学上网 。本文为对软件学院连老师的PPT课件总结所得的复习笔记&#xff0c;仅供参考。不保证对考点的全覆盖&#xff0c;以PPT为主。对往年考过的题相关知识点前面都标注了“考过”&#xff0c;并高亮&#xff0c;供参考。写的比较匆…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力&#xff0c;不仅能够实现远程操控开关电源&#xff0c;部分高端型号更是集成了电量统计与自动化操作功能&#xff0c;为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价&#xff0c;因版本差异可能有所不同。…

分享6个自己每天都会打开的网站

分享6个自己每天都会打开的网站&#xff0c;有实用办公网站&#xff0c;也有休闲摸鱼网站&#xff0c;链接直达&#xff0c;速看~ 1、鸠摩搜索 https://www2.jiumodiary.com/ 一个免费的电子书下载网站&#xff0c;页面干净无广告&#xff0c;只有一个搜索框&#xff0c;输入…

Playwright之录制脚本转Page Object类

Playwright之录制脚本转Page Object类 设计思路 &#xff1a; 我们今天UI自动化设计的时候&#xff0c;通常会遵循一些设计模式&#xff0c;例如Page Object模式。但是自己找元素再去填写有一些麻烦&#xff0c;所以我们可以通过拆解录制的脚本&#xff0c;将其中的元素提取出来…

vue3中pinia使用持久化管理

安装插件 npm install pinia pinia-plugin-persistpinia进行注册 创建index.ts import { createPinia } from pinia; //对外暴露大仓库 export default createPinia(); 在mian.ts //引入pinpa import { createApp } from vue //引入根组件 import App from ./App.vue const…

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定&#xff0c;如代码所示&#xff0c;div后面的引号就是v-bind绑定&#xff0c;然后大括号将整个对象括起来&#xff0c;对象内先是属性&#xff0c;属性后接的是变量&#xff0c;这个变量是定义在script中的&#xff0c;后通过这个变量&#xff…

CAN转PN网关模块连接激光切割机的配置方法

激光切割机在工业生产中被广泛应用&#xff0c;而激光发射器与控制设备常以不同的协议存在两者之间&#xff0c;CAN总线和Profinet以各自的特点被广泛用于设备当中。本文将介绍介绍兴达易控CAN转Profinet网关模块&#xff08;XD-PN_CAN20&#xff09;连接 CAN 激光切割机的使用…

【算法 - 哈希表】两数之和

这里写自定义目录标题 两数之和题目解析思路解法一 &#xff1a;暴力枚举 依次遍历解法二 &#xff1a;使用哈希表来做优化 核心逻辑为什么之前的暴力枚举策略不太好用了&#xff1f;所以&#xff0c;这就是 这道题选择 固定一个数&#xff0c;再与其前面的数逐一对比完后&…

如何在 Ubuntu上搭建 LAMP

远程登录 Ubuntu系统环境 ssh (User)(IP) # 比如&#xff1a;ssh lennlouis192.168.207.128 为安全起见&#xff0c;建议你使用 root 登录 VPS 后创建一个具有 sudo 权限的帐号。 安装和配置 Apache 2 Apache Http Server 是一个开源的&#xff0c;非常流行&#xff0c;使用…

RAG 为什么需要文本分割(Chunking)

Picone上的一个博客&#xff0c;翻译过来学习一下&#xff0c;其中加入了一些个人的理解和调整&#xff0c;有兴趣更深入研究的可以看一下文章的原文。 为什么需要文本分割&#xff08;Chunking&#xff09; 在构建与LLM相关的应用程序时&#xff0c;Chunking是将大量文本分解…

anaconda命令大全

目录 查看所有虚拟环境查看某虚拟环境安装的包创建虚拟环境激活创建好的虚拟环境回到之前的环境删除创建的虚拟环境查看conda所在的位置、虚拟环境位置等信息conda修改虚拟环境所在的位置 查看所有虚拟环境 conda env list查看某虚拟环境安装的包 激活要查看的虚拟环境之后&a…

【黑马头条】 article微服务编译失败,包com.heima.model.common.article.dtos 不存在

解决办法&#xff0c; 将 model微服务重新打包编译下载 然后在service的pom文件里面加上版本号 这样编译就不会找不到啦

SQL注入【1】——通用漏洞/SQL注入/mysql跨库/ACCESS偏移

一、知识点: 1、脚本代码与数据库前置知识 2、Access数据库注入-简易&偏移 3、MYSQL数据库注入-简易:权限跨库 二、前置知识: &#xff08;一&#xff09;SQL注入漏洞产生原理分析 SQL注入产生条件&#xff1a;根本条件&#xff1a;可控变量、特定函数。 脚本代码在实现…

数学建模MATLAB绘图大全

最近快要开始一年一度的数学建模竞赛啦&#xff0c;接下来争取每天更一篇数学建模算法&#xff01;&#xff08;当然这是理想状态下&#xff09;&#xff0c;今天就先更一些MATLAB常用的绘图吧&#xff0c;论文赏心悦目的关键就在于丰富多彩的图&#xff0c;好看的图一定会成为…

MySql主从同步延迟怎么办?

文章目录 什么是MySQL主从架构主从架构的组成工作原理主从复制的步骤主从架构的优点主从架构的缺点 什么是主从同步延迟为什么会导致主从延迟主从延时的排查和解决如果发现主从数据不一致怎么办&#xff1f; 我们常说的业务量越来越大&#xff0c;I/O访问频率过高&#xff0c;单…

2021-06-15 protues(ISIS)脉冲发生器仿真仪表使用

缘由这个脉冲发生器怎么连线_编程语言-CSDN问答

​埃文科技受邀出席2024 “数据要素×”生态大会​

2024“数据要素”生态大会&#xff08;以下简称“大会”&#xff09;于2024年6月30日在河南省郑州市举办&#xff0c;大会主题为“加快数据要素化进程 推动新质生产力发展”。 本次大会旨在搭建高水平交流合作平台、分享前沿观点、展示先进技术、交流实践经验&#xff0c;共同探…

开放式蓝牙耳机推荐,开放式耳机选购小技巧大公开!

跑步是我们生活中最常见的运动方式。在跑步中佩戴耳机往往能达到“事半功倍”的效果&#xff0c;如何去选择一款好的运动耳机便需要精挑细选了。作为一个开放式耳机资深玩家兼马拉松参与者&#xff0c;我个人觉得开放式耳机是最适合跑步的了&#xff0c;其开放式的设计更加适合…