Hadoop Exporter开源项目
该项目最后一次更新为2018年。其主要就是监控集群中的各个组件的JMX端口。而开源的集群大多数也都是通过JMX开放自己的重要监控数据。例如:HDFS、YARN等。
总体来说,项目是不错的,如果我们自己去逐个组件开发支持Prometheus,会耗用我们大量时间。所以,在完成Hadoop集群监控的对接后,考虑到将来项目的升级、扩展。我Fork了该项目,后续对项目持续维护,后续还会提供独立的版本号。
可以说Hadoop Exporter是一个ETL项目。负责将JMX的JSON数据转换为维度模型。我把当前架构理解为如下:
当前V1.0版本,ETL程序需要在每个节点上安装,而不能做统一采集,这样当有集群扩展或变更时,不利于维护。d但好处是,各个ETL程序彼此独立,互不干涉。
项
说明
开发语言
Python
开发语言版本
2.7.x
依赖库
request、prometheus_client、python-consul、pyyaml
解析命令行参数
启动Prometheus对外暴露指标的HTTP服务器
向集群JMX配置中心发送HTTP请求,通过本机的hostname拿到JMX配置信息
根据配置中心中配置的不同进程对应的JMX URL,创建对应的Collector实例
将Collector注册到Prometheus客户端
当服务器端请求拉取JMX指标时,会自动调用对应Collector的collect方法
获取JMX端口的MBean,在根据不同的进程处理标签、再处理指标。
用通用指标更新指定实例指标
入口
hadoop_exporter.py
cmd
处理各类JMX指标核心代码
config
存放配置
test
存放测试数据
类名以大写驼峰式命名
单类单文件
公开方法以小写字母开头,用下划线分隔单词
公开方法需要使用文档注释
私有方法以下划线开头
初始化方法统一放在__init__中
每增加一类组件,需要新增一个Collector实现
每增加一类组件,需要创建一个目录,并基于MBean对指标进行分类
在核心流程上的节点必须添加logger.info,为了方便日后排错,多提供logger.debug信息
所有的JMX指标封装在一个名为beans的数组中。
name为MBean的名称
其他的均为对应监控信息。
因为Prometheus中采用的是维度模型,所以,需要将JMX中的数据转换为维度模型。例如:字符串类型为维度、数值类型为指标。而有哪些指标、指标对应需要有什么标签,需要我们自己来定义、实现。
上述数据为扁平化的事实指标数据,要转换为维度结构。首先需要确定哪些是指标数据哪些是维度数据,简单点来理解就是。这个部分针对不同的MBean都是不一样的。所以需要在应用中实现转换。例如:针对NameNode、DataNode。还有一些指标是不能进行分类的,就可以直接将指标,以及使用预定义维度,例如:cluster、instance等。
目标维度指标结构表示Prometheus能够识别的指标数据。在项目中,它存储为一个二维字典结构。例如:
以hdfs_namenode.py为例。
JSON指标配置文件语法格式如下:
例如:
注意: 所有想要导出的指标都应该放在对应服务名称目录下的JSON文件中 组件名称为指标的前缀:hadoop_hdfs_
collect方法为针对组件进行指标数据转换的核心实现。它的实现主要分为以下几步:
请求JMX
设置Label
设置Metric
_setup_metrics_labels表示从MBean中加载标签。
下面的代码表示对JSON文件中配置的指标进行遍历,并对匹配到的指标进行处理。下面的实现逻辑为以下:
遍历每一个NameNode中的NameNodeActivity.json中定义的指标
定义Label(此处只有cluster、method)
因为NameNodeActivity对应的指标有以下几类:
程序对这些数据进行维度抽象处理。
以NumOps结尾的
以AvgTime结尾的
其他(其他操作都放入到Operation中)
设置指标以及维度标签
该方法表示设置指标值到之前生成的指标中。
加载指标值其实就是从MBean中将指标取出来,然后设置好即可。注意:加载指标值需要在加载label之后执行。
在组件中有不少的指标是公共的,例如:JVM相关的、操作系统相关的、RPC相关的、UGI、运行时相关的等等。这些指标定义在common文件中的JSON文件中。
将这些指标抽取出来处理,可以复用代码。毕竟,大数据集群中有不少的组件其实都是基于JVM的。
可以看到,common指标的实现和之前的组件类似,也是先处理Label、然后处理指标值。
根据不同的MBean,调用不同设置Label方法。
下面以JVM指标为例。可以看到,与之前的处理方式类似,也是根据不同类似的指标进行维度分组,然后设置标签。
与之前的处理指标值类似。
实现好Collector后,需要到hadoop_exporter.py中的register_prometheus中进行处理。例如:
Hadoop运行指标使用github上的Hadoop exporter。项目地址:https://github.com/IloveZiHan/hadoop_exporter
1、部署tomcat
2、添加服务发现json
3、启动tomcat