如何使用JMX

如何使用JMX,第1张

如何使用JMX
  • JMX_Expoter
  • 监控

因为目前CDH以及HDP后续要合并闭源,公司打算花时间自研一个类似的平台,我也对集群监控这块下了点功夫。

监控

​ 对于一个集群管理平台,首当其冲的就是其中的监控如何实现,毕竟很多时候我们打开它只是因为邮箱里收到了报警:-),那么我们应该如何获取Hadoop等集群的信息呢?这时候需要简单了解一个知识点了:JMX。

​ 我们简单介绍一下Java的JMX是什么,JMX全程叫做Java Management Extensions,翻译过来就是Java内存管理,最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。

总而言之,就是Java自己开发的用于监控JVM指标的一个工具,可以提供给一些界面JConsole,VisualVM使用,详细信息可以参考这里!

获取集群的JMX信息

​ Hadoop,Hbase集群都提供了便捷获取集群JMX信息的途径,具体通过在访问地址后面加上/jmx来实现,比如我们访问hdfs的NameNode页面的时候地址是localhost:50070,那么在后面加上一个/jmx即为localhost:50070/jmx,访问即可得到类似下面的信息。

​ 上面图中具体指标信息可以在Hadoop官方文档对应的metrics章节中找到,其中包括了Namenode以及Datanode相关信息,同理如果我们在8088端口后面加上/jmx即可获得关于Yarn相关指标信息。

​ 现在我们监控的信息有了,接下来如果我们想将数据在监控折线图中展现出来的话就需要一个时序数据库,因为监控指标数据必须存在对应的时间才有意义,目前比较常见的时序数据库+界面组合是普罗米修斯(时序数据库)+ Grafana(界面展示),那么目前的问题就转换成了如何将Hadoop集群中的JMX信息传递给普罗米修斯,简单调研就可以发现,普罗米修斯自己开发了一款插件支持将java程序对应的jmx信息传递到自己的时序数据库中,插件地址。

根据自己Java环境版本下载插件,将插件放置到自己选定的位置,现在插件有了,就差如何在集群中使用插件了,我们开始着手修改集群中的配置

Hadoop集群配置Jmx_expoter

在hadoop-env.sh中最后添加以下代码,注意将其中的路径修改成自己系统中的路径,这段代码的主要作用是添加我们下载的jar包,以及给jar包传递配置文件,以及指定该服务要占用的端口,这里的对应位置的配置文件prometheus_config.yml测试的时候可以直接创建一个空文件即可。

if ! grep -q <<<"$HDFS_NAMENODE_OPTS" jmx_prometheus_javaagent; then
HDFS_NAMENODE_OPTS="$HDFS_NAMENODE_OPTS -javaagent:/usr/local/Cellar/hadoop/3.3.1/jmx_prometheus_javaagent-0.16.1.jar=27001:/usr/local/Cellar/hadoop/3.3.1/libexec/etc/hadoop/prometheus_config.yml"
fi
if ! grep -q <<<"$HDFS_DATANODE_OPTS" jmx_prometheus_javaagent; then
HDFS_DATANODE_OPTS="$HDFS_DATANODE_OPTS -javaagent:/usr/local/Cellar/hadoop/3.3.1/jmx_prometheus_javaagent-0.16.1.jar=27002:/usr/local/Cellar/hadoop/3.3.1/libexec/etc/hadoop/prometheus_config.yml"
fi

注意事项 :

1.上面的代码不能直接写成类似以下模式,因为不能在$HADOOP_OPTS中出现multiple -javaagent opts,就是不能直接出现多个-javaagent选项,必须要换一种写法,将-javaagent写在if else代码中可以避免这个问题,详细可以参考这个stackoverflow回答

#写成这种模式会报错
export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"
export HADOOP_DATANODE_OPTS="$HADOOP_DATANODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"

2.同一台机器的每一个JMX服务端口必须区分开

比如上面namenode的jmx服务所占用的端口为27001,datanode的jmx服务所占用的端口为27002,如果使用了相同的端口,那么在启动hdfs服务(./start-dfs.sh)的时候会报如下所示的错。

Starting namenodes on [localhost]
Starting datanodes
localhost: /usr/local/Cellar/hadoop/3.3.1/libexec/bin/../libexec/hadoop-functions.sh: line 1821: 11125 Abort trap: 6           hadoop_start_daemon "${daemonname}" "$class" "${pidfile}" "$@" >> "${outfile}" 2>&1 < /dev/null
localhost: ERROR: Cannot set priority of datanode process 11125
localhost: ERROR: Cannot disconnect datanode process 11125

这样配置完成之后,Hadoop的jmx信息就被采集到指定的端口中了,接下来我们可以在网页上测试一下我们的采集数据,访问地址就是前面配置的端口 localhost:27001

同理我们的Yarn相关信息采集也要在yarn-env.sh中配置上面类似的代码,其中同样要注意区分端口号,并且不要同时出现两个-javaagent,将两个javaagent放到不同的if else中。

Hbase集群配置

因为我是启动的单机版本的Hbase,所以我只配置Hbase_MASTER_OPTS和Hbase_JMX_base选项,如果是集群模式可能还需要配置Hbase_REGIONSERVER_OPTS,将下面内容替换成自己的文件路径然后添加到hbase-env.sh的尾部。

export Hbase_JMX_base="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
export Hbase_MASTER_OPTS="$Hbase_MASTER_OPTS $Hbase_JMX_base -Dcom.sun.management.jmxremote.port=20101 -javaagent:$Hbase_HOME/lib/jmx_prometheus_javaagent-0.16.1.jar=27000:$Hbase_HOME/conf/hbase_jmx_config.yaml"

这样我们就可以通过指定端口访问各个集群的JMX信息了,下一步就是配置Prometheus将数据导入到时序数据库中。

配置Prometheus

打开Prometheus配置文件,并且在后面增加关于Hadoop集群的NameNode,DataNode以及Hbase的jmx数据配置,增加如下代码,重启普罗米修斯服务。

- job_name: "hbase"
    static_configs:
    - targets: ["localhost:27000"]
      labels:
          instance: localhost
  - job_name: "hadoop namenode"
    static_configs:
    - targets: ["localhost:27001"]
      labels:
          instance: localhost
  - job_name: "hadoop datanode"
    static_configs:
    - targets: ["localhost:27002"]
      labels:
          instance: localhost

我们打开Prometheus的页面查看对应的target,查看我们配置的任务,如果出现下面几个选项并且是绿色的说明是正常的,打开采集的结果网址会发现其中Prometheus采集的指标名称相比于原先集群50070/jmx的指标名称是经过处理的,比如Prometheus中有一个指标叫做hadoop_namenode_memnonheapmaxm他在50070/jmx中是名称是memnonheapmaxm,然后前面加上service name等,其中的匹配规则应该在插件的配置文件prometheus_config.yml中设置的,详细可以看插件地址。

最后选出来我们需要的指标之和在Grafana中展示出来即可,具体方法这里不再展示,可以参考[这篇教程](

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5154150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存