天天看点

Hadoop Exporter开源项目开发指南

Hadoop Exporter开源项目

该项目最后一次更新为2018年。其主要就是监控集群中的各个组件的JMX端口。而开源的集群大多数也都是通过JMX开放自己的重要监控数据。例如:HDFS、YARN等。

总体来说,项目是不错的,如果我们自己去逐个组件开发支持Prometheus,会耗用我们大量时间。所以,在完成Hadoop集群监控的对接后,考虑到将来项目的升级、扩展。我Fork了该项目,后续对项目持续维护,后续还会提供独立的版本号。

可以说Hadoop Exporter是一个ETL项目。负责将JMX的JSON数据转换为维度模型。我把当前架构理解为如下:

Hadoop Exporter开源项目开发指南

当前V1.0版本,ETL程序需要在每个节点上安装,而不能做统一采集,这样当有集群扩展或变更时,不利于维护。d但好处是,各个ETL程序彼此独立,互不干涉。

说明

开发语言

Python

开发语言版本

2.7.x

依赖库

request、prometheus_client、python-consul、pyyaml

Hadoop Exporter开源项目开发指南

解析命令行参数

启动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