如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群
- 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中展示出来即可,具体方法这里不再展示,可以参考[这篇教程](
如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群相关推荐
- K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程
K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...
- jmx_exportter+prometheus+grafana监控hadoop
0.介绍(摘录自https://www.hi-linux.com/posts/25047.html) 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和 ...
- ganglia监控hadoop集群配置
1:ganglia简介 ganglia是UC Berkeley发起的一个开源集群监控项目,设计用于测量和监控数以千计的节点. 主要是采用监控系统性能,如cpu,内存,硬盘使用率,I/O负载,网络流量情 ...
- zabbix搭建并结合mikoomi插件监控hadoop集群
一.环境说明 系统: CentOS release 6.4 mysql 5.1.67 Apache/2.2.25 二.安装php 由于zabbix提供的frontends是php编写的,因此需要搭建l ...
- 学习笔记Hadoop(八)—— Hadoop集群的安装与部署(5)—— Hadoop配置参数介绍、Hadoop集群启动与监控
五.Hadoop配置参数介绍 Hadoop集群配置文件主要有: 它们的默认参数配置可以看: core-default.xml :https://hadoop.apache.org/docs/stabl ...
- 5. Hadoop集群操作
5. Hadoop集群操作 5.1 启动Hadoop集群 5.1.1 格式化文件系统 如果集群是第一次启动,需要在hadoop102节点格式化NameNode. 注意:格式化NameNode,会产生新 ...
- 集群外独立部署Prometheus+Grafana监控K8S全面解析
简介 Prometheus+Grafana作为监控K8S的解决方案,大都是在K8S集群内部部署,这样可以直接调用集群内的cert及各种监控url,但是增加了集群的资源开销.因此在资源有限的情况下,我更 ...
- 使用Prometheus监控kubernetes集群
一键安装(网络可访问quay.io): kubectl apply --filename https://raw.githubusercontent.com/giantswarm/kubernetes ...
- 巧用 Prometheus 监控 Kubernetes 集群所有组件的证书
KubeSphere 虽然提供了运维友好的向导式操作界面,简化了 Kubernetes 的运维操作,但它还是建立在底层 Kubernetes 之上的,Kubernetes 默认的证书有效期都是一年,即 ...
最新文章
- 禁用outlook2007 垃圾邮件过滤功能
- 国家会展中心启动5G网络建设,推进无人驾驶等应用场景落地
- Web前端开发笔记——第二章 HTML语言 第四节 超链接标签
- Bootstrap中水平排列的表单form-inline
- 【转】认识 C++ 中的 explicit 关键字
- 作为多年 PHP 的开发者,在使用了 Go 语言之后......
- 制作数据集---labelImg和labelme
- Arcgis API For js 的离线部署
- 数学建模暑期集训6:用SPSS对数据进行多元线性回归分析
- 理解 rb_tree
- Web开发浅涉(以JAVA为例)
- 运算符与基本数据类型int和string的方法汇总(二)
- 在GitHub,他们是怎么玩的? (转)
- SAP ERP是什么意思?
- 【HBase学习笔记-尚硅谷-Java API shell命令 谷粒微博案例】
- 基于图像处理的缺陷检测系统 matlab的设计
- ZEGO 最后一公里网络传输的容灾及优化方案
- Mycat原理详解,Mycat 实现 MySQL 的读写分离(Mysql主从复制)
- js实现a标签点击下载图片和txt等文件,而不是浏览器打开预览
- 青龙面板-微信阅读 脚本
热门文章
- 【python】二进制与十进制的转换
- 收发电子邮件属于计算机在方面的应用( ),收发电子邮件属于计算机在( )方面的应用...
- 【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce
- 马小看前端( 在开发中遇到问题如何解决 )
- 在canvas画布上多次绘制图形叠加的效果
- python:pass关键字的作用
- SAP ABAP ZBA_R004 批量导入角色里的事务代码,解放BASIS的双手
- chatgpt平替,清华chatglm本地化部署教程(aigc大模型风口,校招找工作必备),包含weiui部署,api部署,对话框部署
- 用户需求调研—快速上手篇
- Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.5 - 图生成 / 随机图