首页 > 其他分享 >什么是 JMX?(Trino JMX 实战讲解)

什么是 JMX?(Trino JMX 实战讲解)

时间:2023-09-03 19:15:13浏览次数:36  
标签:JMX name jmx 讲解 Coodinator Trino trino

目录

一、概述

JMXJava Management ExtensionsJava管理扩展) 的缩写,它是 Java 平台上用于管理和监控应用程序、系统和网络资源的一种标准化的管理和监控框架。JMX 提供了一种标准的方式,通过这种方式,开发人员可以暴露应用程序中的各种管理和监控信息,然后可以使用 JMX 客户端工具或应用程序来访问和操作这些信息。

JMX 允许开发人员定义称为 MBeans(Managed Beans)的管理组件,这些组件充当被管理资源的代理,并通过 JMX 接口公开资源的操作和属性。通过 MBeans,您可以监控和管理各种 Java 应用程序和服务器的性能、状态和配置。

JMX 主要用于以下一些方面:

  • 监控:可以使用 JMX 来监视应用程序的性能指标,例如内存使用、线程数、请求处理速度等。这对于实时性能分析和故障排除非常有帮助。

  • 管理:JMX 允许您在运行时管理应用程序,例如修改配置参数、重新加载资源、触发操作等。这有助于实现动态管理和配置。

  • 远程管理:JMX 支持远程访问,这意味着您可以在不必物理接触应用程序的情况下,从远程位置监控和管理应用程序。

  • 自定义监控:您可以编写自定义 MBeans 来公开特定于您的应用程序的监控数据和操作,以满足特定的管理需求。

总之,JMX 提供了一个强大的框架,用于管理和监控 Java 应用程序,这对于确保应用程序的稳定性和性能至关重要。它广泛用于企业级应用程序和服务器,如应用程序服务器、数据库服务器和中间件。

二、JMX 原理

在这里插入图片描述
从图中我们可以看到,JMX的结构一共分为三层:

  1. 基础层:主要是 MBean,被管理的资源。

MBean 分为如下四种,我接下来主要介绍 standard MBean

类型 描述
standard MBean 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
open MBean 此MBean的规范还不完善,正在改进中
model MBean 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。后面的例子会有详细介绍
  1. 适配层:MBeanServer,主要是提供对资源的注册和管理。

  2. 接入层:提供远程访问的入口。

三、实战操作(开启 Trino JMX)

1)环境部署

如果想快速部署,可以参考我之前的文章:

Trino官方文档:https://trino.io/docs/current/

这里为了快速部署就选择docke-compose部署了。

git clone https://gitee.com/hadoop-bigdata/docker-compose-presto.git
cd docker-compose-presto

# 启动服务
docker-compose -f docker-compose.yaml up -d

# 查看
docker-compose -f docker-compose.yaml ps

2)开启 Trino JMX

官方文档:https://trino.io/docs/current/admin/jmx.html

1、配置 config.properties

jmx.rmiregistry.port=9080
jmx.rmiserver.port=9081

参数解释:

  • jmx.rmiregistry.port:指定jmx RMI注册表的端口。JMX客户端应该连接到此端口。
  • jmx.rmiserver.port:指定jmx RMI服务器的端口。Trino导出许多指标,这些指标对于通过JMX进行监控非常有用。

2、配置 jvm.config

-Dcom.sun.management.jmxremote.rmi.port=9081

jmx.rmiregistry.portjmx.rmiserver.port-Dcom.sun.management.jmxremote.rmi.port 这三者都涉及到 Java Management Extensions (JMX) 和远程管理的端口配置,但它们各自在不同的上下文中起作用:

  • jmx.rmiregistry.port:这个属性指定了 RMI(Remote Method Invocation:远程方法调用) 注册表(RMI Registry)的端口号。RMI 注册表用于注册 JMX 服务,以便客户端可以查找并连接到 JMX 服务。通常情况下,RMI 注册表使用默认端口1099。通过设置 jmx.rmiregistry.port 属性,你可以指定 RMI 注册表使用的不同端口号,以防止端口冲突或增加安全性。

  • jmx.rmiserver.port:这个属性指定了 JMX 服务本身的 RMI 通信端口号。JMX 服务使用 RMI 进行远程通信,客户端通过这个端口与 JMX 服务通信。通常情况下,JMX 服务也使用默认的端口1099。通过设置 jmx.rmiserver.port 属性,你可以指定 JMX 服务的 RMI 端口号。

  • -Dcom.sun.management.jmxremote.rmi.port:这是 Java 系统属性,用于配置 JMX 远程连接的 RMI 端口号。它指定了客户端将用来连接到 JMX 服务的 RMI 端口号。通常情况下,如果不显式设置,它会使用与 jmx.rmiserver.port 相同的端口号。但你也可以使用这个系统属性来指定不同的端口号,以确保客户端可以连接到正确的端口。

这三者之间的关系是:

jmx.rmiregistry.port 和 jmx.rmiserver.port 分别指定 RMI 注册表和 JMX 服务的端口号。
-Dcom.sun.management.jmxremote.rmi.port 可以用来指定客户端连接到 JMX 服务时所使用的 RMI 端口号,它通常设置为与 jmx.rmiserver.port 相同的端口号,但你也可以根据需要将其设置为不同的端口号。

3、重新启动服务

docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml ps

4、获取监控数据

curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean

在这里插入图片描述
通过jmx 接口就可以获取监控数据了/v1/jmx/mbean,但是数据很多,其实我们可以拿一些我们需要的指标数据即可。接下来我们通过jq 拿到各项监控的子接口。jq 命令的使用可以参考我这篇文章:Linux jq 命令讲解与实战操作(json字符串解析工具)

# coodinator
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'

在这里插入图片描述
访问具体接口指标

# 内存指标接口
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'|grep -i memory

# 指标名称
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].name'

# 指标值
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].value'

# 指标名称
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].value'

在这里插入图片描述

# worker 节点,coodinator与worker节点的指标会有些不一样
curl -s -H "X-Trino-User:admin" http://192.168.182.110:49153/v1/jmx/mbean|jq '.[].objectName'

# 获取内存接口
curl -s -H "X-Trino-User:admin" http://192.168.182.110:49153/v1/jmx/mbean|jq '.[].objectName'|grep -i memory

# 指标名称
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].value'

在这里插入图片描述

3)通过 jconsole 连接 JMX

JConsole 是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置 com.sun.management.jmxremote

找到java安装bin目录,目录下有个jconsole可执行文件,双击点击打开。
在这里插入图片描述

也可以通过 VisualVM 连接 JMX 查看数据
在这里插入图片描述

4)常用的 Trino 指标接口和指标

查询所有jmx子接口:

curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'

# 查询指标名称和值,示例如下:
# 指标名称
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].value'

以下就是常用的指标接口和指标说明:

指标接口 指标 说明 指标范围
java.lang:type=Memory HeapMemoryUsage JVM内存使用量。 Worker 和 Coodinator
java.lang:type=Memory NonHeapMemoryUsage 非堆内存使用量。 worker 和 Coodinator
trino.execution:name=QueryManager QueuedQueries 排队数 Coodinator
trino.execution:name=QueryManager RunningQueries 正在运行的查询总数 Coodinator
trino.execution:name=QueryManager ExternalFailures.OneMinute.Count 每分钟外部异常导致的失败查询数。 Coodinator
trino.execution:name=QueryManager SubmittedQueries.OneMinute.Count 每分钟提交的查询总数。 Coodinator
trino.execution:name=QueryManager CanceledQueries.OneMinute.Count 已取消查询的数。 Coodinator
trino.execution:name=QueryManager InsufficientResourcesFailures.OneMinute.Count 每分钟资源不足导致的失败查询数。 Coodinator
trino.execution:name=QueryManager UserErrorFailures.OneMinute.Count 每分钟异常导致的失败查询数。 Coodinator
trino.execution:name=QueryManager CompletedQueries.OneMinute.Count 已完成查询的总数。 Coodinator
trino.execution:name=SqlTaskManager FailedTasks.OneMinute.Count 每分钟失败的Task数目。 Coodinator
trino.execution:name=SqlTaskManager InputDataSize.OneMinute.Count 每分钟Task输入数据量。 Coodinator
trino.execution:name=SqlTaskManager InputPositions.OneMinute.Count 每分钟Task输入数据行数。 Coodinator
trino.execution:name=SqlTaskManager OutputDataSize.OneMinute.Count 每分钟Task输出数据量。 Coodinator
trino.execution:name=SqlTaskManager OutputPositions.OneMinute.Count 每分钟Task输出数据行数。 Coodinator
trino.memory:type=MemoryPool,name=general FreeBytes 节点内存池可用内存。 worker 和 Coodinator
trino.memory:type=MemoryPool,name=general MaxBytes 节点内存池最大内存(JVM*70%)。 worker 和 Coodinator
trino.memory:type=MemoryPool,name=general ReservedBytes 节点内存池reserved内存。 worker 和 Coodinator
trino.memory:type=MemoryPool,name=general ReservedRevocableBytes 节点内存池revocable reserved内存。 worker 和 Coodinator
trino.memory:type=ClusterMemoryPool,name=general ReservedRevocableDistributedBytes 集群内存池revocable reserved内存。 Coodinator
trino.memory:name=ClusterMemoryManager QueriesKilledDueToOutOfMemory oom killed的查询总数。 Coodinator
trino.memory:type=ClusterMemoryPool,name=general TotalDistributedBytes 集群内存池总内存。 Coodinator
trino.memory:type=ClusterMemoryPool,name=general ReservedDistributedBytes 集群内存池reserved内存。 Coodinator
trino.memory:name=ClusterMemoryManager ClusterUserMemoryReservation 集群reserved user memory。 Coodinator
trino.memory:name=ClusterMemoryManager ClusterTotalMemoryReservation 集群reserved内存。 Coodinator
trino.memory:name=ClusterMemoryManager NumberOfLeakedQueries 集群内存泄漏的查询总数。 Coodinator
trino.memory:name=ClusterMemoryManager ClusterMemoryBytes 集群总内存。 Coodinator
trino.execution.executor:name=TaskExecutor WaitingSplits 任务执行器上等待的splits数。 Coodinator
trino.execution.executor:name=TaskExecutor RunningSplits 任务执行器运行的splits数。 Coodinator
trino.execution.executor:name=TaskExecutor RunningSplits 任务执行器总splits数。 Coodinator

上面只是开启了 Trino JMX,指标数据也采集了,怎么展示呢?下一篇文章重点讲解通过 JMX-Exporter 采集数据,然后通过 Prometheus 拉取JMX采集的数据,最后通过Grafana展示。


JMX 的讲解就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

标签:JMX,name,jmx,讲解,Coodinator,Trino,trino
From: https://www.cnblogs.com/liugp/p/17675356.html

相关文章

  • 【WCH蓝牙系列芯片】-基于CH582开发板—基础外设输出PWM波形讲解
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------在WCH官方提供的CH583的EVT资源包中,我们可以找到PWMX的例程,这是一个8位的PWM输出,占空比和周期可调的......
  • Keil5 MDK的详细讲解及与Keil 4的区别介绍
    引言:Keil5MDK(MicrocontrollerDevelopmentKit)是一款广泛应用于嵌入式系统开发的集成开发环境(IDE)。本文将详细讲解Keil5MDK的特点、功能和使用方法,并对比Keil4与Keil5MDK之间的区别,以帮助读者更好地了解Keil5MDK并选择适合自己的开发环境。一、Keil5MDK的特点:嵌入式开发支持:K......
  • Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)
    1前言在数据可视化的世界中,绘制清晰、易于理解的图表是非常关键的。Streamlit是一个流行的Python库,它提供了简单的界面和强大的功能,帮助用户轻松创建交互式应用程序和数据可视化。而其中的Chartelements(图表元素)部分则为我们提供了多种图表类型来展示数据。本文将深入介绍......
  • trino on yarn
    一、前言   最近在研究trinoonyarn功能,网上大部分都是关于prestoonyarn文章,关于trinoonyarn资料很少,但是本质上差不多,需要修改一些内容比,主要在调试方面这个slider不是很方便,分享下实践过程。 如果Trino集群没有弹性扩缩容需求或者已经有很成熟的K8S容器部署方案......
  • 【讲解】康托展开
    问题是这样的,给出一个\(1\simN\)全排列,求在所有\(1\simN\)全排列中的排名。如果暴力枚举\(1\simN\)每一个全排列,再\(O(N)\)判断是否符合,时间复杂度轻松爆炸,这时候便需要康托展开。首先把这个\(1\simN\)的全排列记为\(A\),他从左往右的第\(i\)位记为\(A_i\),问题......
  • JVM 与 GC 讲解
    目录一、概述二、JVM内存模型三、GC算法和回收器1)垃圾回收算法2)垃圾回收器四、垃圾回收机制(GC)1)分代垃圾回收机制2)G1垃圾回收器3)FullGC机制一、概述JVM(JavaVirtualMachine)是一种在计算机上运行Java字节码的虚拟机。它允许Java程序在不同的操作系统上具有跨平台的能力,因为......
  • 语音直播讲解软件
      直播本身就是需要借助运用人员实现带货的,如果商家觉得运营成本太高的话,就可以借助直播软件了,语音直播讲解软件可以让用户通过语音进行交互式的讲解,让学习更加高效、便捷。本文将介绍语音直播讲解软件的主要功能和特点。  一、文字识别技术  语音直播讲解软件的核心......
  • 讲解pytorch的tensor没有移除某个元素的操作
    在PyTorch中,要从一个Tensor中移除一个元素,您需要使用索引操作来选择保留的元素,然后重新创建一个新的Tensor。由于PyTorch的Tensor是不可变的,所以无法直接在原Tensor上移除元素。下面是一个示例,展示了如何从一个PyTorchTensor中移除指定位置的元素:importtorch#......
  • DPDK-22.11.2 [四] 官方basicfwd编译运行讲解
    编译安装dpdk绑定网卡驱动vfio必须有两个网口配置LD_LIBRARY_PATH和PKG_CONFIG_PATH编译运行basicfwd.c/*SPDX-License-Identifier:BSD-3-Clause*Copyright(c)2010-2015IntelCorporation*/#include<stdint.h>#include<stdlib.h>#include<inttypes.h>#incl......
  • 人体感应太阳能灯原理图详细讲解
    人体感应太阳能灯原理图详细讲解三河凡科科技飞讯教学篇,人体感应太阳能灯是一种利用太阳能源供电,通过人体红外线感应技术实现智能控制灯源开关的照明设备。其原理是利用太阳能板将太阳能转化为电能,通过对电池的储存和管理,将电能存储在电池中,作为灯源使用时的电力供应。同时,通过人......