通过 JMX 获取Hadoop/HBase监控数据

概述

说到对Hadoop和 HBase的集群监控,大家知道的和用的最多的可能还是第三方的监控工具,cacti,ganglia,zabbix之类的。玩的深一些的,会用 zenoss之类的。这些工具确实不错,也能发挥很大的作用,但时间长了总感觉监控粒度还是比较粗,不够详细。毕竟是第三方的监控,即便Hadoop自带 了ganglia的接口,也还是觉得不够。

其实Hadoop本身是带有监控接口的,各公司的发行版还有自己定制的接口,不过可能知道的人就不太多了。

其实这个接口特别简单,但是非常详细,也非常方便,就是JMX。

Hadoop的http监控端口基本所有人都知道,namenode 50070,jobtracker 50030,datanode 50075,tasktracker 50060。不过当用户访问这些端口的时候,会自动跳转到dfshealth.jsp或者jobtracker.jsp这样的监控页面。jmx的访问很简 单,只需要把网页的名字换成jmx就可以了。

例如

http://your_namenode:50070/dfshealth.jsp的地址替换成http://your_namenode:50070/jmx

即可,其他如50030,50060等等,也依次类推,HBase的系统信息也可以用这种方法获取。

返回值全部是JSON,非常便于自己进行处理。返回的信息也非常详细,内存状态,内存池状态,java堆信息等等。甚至还有操作系统信息,版本,JVM版本信息等等,很全面。

实现

对于http://your_namenode:50070/jmx 这样地址的数据访问可以通过HttpClient进行数据访问,再将得到的数据通过

由于返回的Json数据量很大,而且基本上不可能全部需要,对于这种情况可以通过添加?qry方式获得部分数据,

例如http://your_namenode:60010/jmx?qry=Hadoop:service=HBase,name=Master,sub=Server

Maven配置:

        <dependency>

            <groupId>commons-httpclient</groupId>

            <artifactId>commons-httpclient</artifactId>

            <version>3.1</version>

        </dependency>

        <dependency>

            <groupId>org.json</groupId>

            <artifactId>json</artifactId>

            <version>20090211</version>

        </dependency>

Java类

该程序以获得Hbase的监控数据为例,关于HDFS的监控数据相似

/**
 * 作为HBase Master监控信息的source
 *
 * @author aihua.sun
 * @date 2015/4/6
 * @since V1.0
 */

import com.eric.agent.flume.model.HMasterRoleInfo;
import com.eric.agent.utils.AgentConstants;
import com.eric.agent.utils.MetricDataUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HBaseMasterDataProvider{
    protected final Logger LOGGER = LoggerFactory.getLogger(getClass());
    private static final String server = "Hadoop:service=HBase,name=Master,sub=Server";
    private static final String assignment = "Hadoop:service=HBase,name=Master,sub=AssignmentManger";

    @Override
    public String extractMonitorData() {
        //TODO 通过调用API获得IP以及参数
        HMasterRoleInfo monitorDataPoint = new HMasterRoleInfo();
        String URL = "http://hostname:60010/jmx";

        JSONObject serverJson = qryJSonObjectFromJMX(URL, server);
        JSONObject assignJson = qryJSonObjectFromJMX(URL, assignment);

        try {
            monitorDataPoint.setNumRegionServers(serverJson.getLong("numRegionServers"));
            monitorDataPoint.setNumDeadRegionServers(serverJson.getLong("numDeadRegionServers"));
            monitorDataPoint.setClusterRequests(serverJson.getLong("clusterRequests"));
            monitorDataPoint.setRitCount(assignJson.getLong("ritCount"));
            monitorDataPoint.setRitCountOverThreshold(assignJson.getLong("ritCountOverThreshold"));
            monitorDataPoint.setRitOldestAge(assignJson.getLong("ritOldestAge"));

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return monitorDataPoint.toString();
    }

    public static void main(String[] args){
        System.out.println(new HBaseMasterDataProvider().extractMonitorData());
    }

    /**

     * 通过jmx获取监控数据

     *

     * @param URL

     * @param objectName

     * @return

     */

    public static JSONObject qryJSonObjectFromJMX(String URL, String objectName) {

        JSONObject jsonObject = null;

        try {

            StringBuilder sb = new StringBuilder(URL);

            sb.append("?qry=");

            sb.append(objectName);

            GetMethod getMethod = new GetMethod(sb.toString());

            int statusCode = httpClient.executeMethod(getMethod);

            String jsonStr = new String(getMethod.getResponseBody());

            jsonObject = new JSONObject(removeDuplicateContext(jsonStr)).getJSONArray("beans").getJSONObject(0);

        } catch (JSONException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return jsonObject;

    }
}

参考文章

JMXJsonServlet 介绍

http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/http/jmx/JMXJsonServlet.html

Hadoop指标介绍

http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/Metrics.html#rpc

时间: 2024-10-01 12:23:59

通过 JMX 获取Hadoop/HBase监控数据的相关文章

cacti 安装spine以实现每分钟获取一次监控数据(默认是5分钟)

声明 作者:昨夜星辰 博客:http://yestreenstars.blog.51cto.com/ 本文由本人创作,如需转载,请注明出处,谢谢合作! 服务器配置 # 安装依赖包 yum -y install mysql-devel net-snmp-devel openssl-devel help2man gcc make wget # 下载.解压.配置.编译.安装.生成配置文件 wget http://www.cacti.net/downloads/spine/cacti-spine-0.8

通过TelnetClient获取Zookeeper监控数据

如果想编写一个监控Zookeeper的Java程序,可以通过两种方式 : (1)通过TelnetClient发送命令 ,命令的详解参考:http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands (2)通过JMX,说明请参考:http://zookeeper.apache.org/doc/trunk/zookeeperJMX.html 本文通过一个简单的例子来演示如何通过TelnetClient发送mntr命令获

2511-Druid监控功能的深入使用与配置-如何记录监控数据(基于logback)

Druid的监控很强大,但可惜的是监控数据是存在内存中的,需求就是定时把监控数据记录下来,以日志文件的形式或者数据库入库. 记录两种方式: 数据库入库 logback形式记录 原理(重点) 如果仅仅想记录sql的监控,可以自己重写DruidDataSourceStatLogger的log方法,这个方式是Druid记录日志的默认接口,在此略过. 使用内部接口,直接获取元数据. Druid包中有个DruidStatService类,这个是监控的业务类. 其中有个service方法, public S

如何从Zabbix数据库中获取监控数据

做过Zabbix的同学都知道,Zabbix通过专用的Agent或者SNMP收集相关的监控数据,然后存储到数据库里面实时在前台展示.Zabbix监控数据主要分为以下两类: 历史数据:history相关表,从history_uint表里面可以查询到设备监控项目的最大,最小和平均值,即存储监控数据的原始数据. 趋势数据:trends相关表,趋势数据是经过Zabbix计算的数据,数据是从history_uint里面汇总的,从trends_uint可以查看到监控数据每小时最大,最小和平均值流量. Zabb

zabbix企业应用之定时获取监控数据做报表

最近某项目突然提出一个新需求,需要每周五14点,获取他们监控项目每天20-24点监控平均数据,以小时为单位的,输出文件是excel的,要求以每天为单位单独一个sheet,汇总邮件转给业务. 他们主要是做业务使用量报表,每周周报使用,虽然需求困难,但作为运维也得解决,下面是邮件的效果图. 可以看到邮件标题是带有项目名称与时间,收集人是业务与我. 下面是excel的格式 每天一个sheet,获取这些项目自己每天20-24点的监控平均数据,以小时为单位. 主要是使用sql查看上面的监控数据,并通过py

数道云大数据平台解决方案,Hadoop + HDFS+Hive+Hbase大数据开发整体架构设计

波若大数据平台(BR-odp)Hadoop + HDFS+Hive+Hbase大数据开发工具剖析: HDFS:分布式.高度容错性文件系统,能提供高吞吐量的数据访问,非常适合大规模数据集上的应用,大规模的波若大数据平台(BR-odp)用户部署上1000台的HDFS集群.数据规模高达50PB以上 HDFS和MR共同组成Hadoop分布式系统体系结构的核心.HDFS在集群上实现了分布式文件系统,MR在集群上实现了分布式计算和任务处理.HDFS在MR任务处理过程中提供了文件操作和存储等支持,MR在HDF

Hadoop+Hbase分布式集群架构“完全篇

1.认识Hadoop和Hbase 1.1 hadoop简单介绍 Hadoop是一个使用java编写的Apache开放源代码框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理.Hadoop框架工作的应用程序可以在跨计算机群集提供分布式存储和计算的环境中工作.Hadoop旨在从单一服务器扩展到数千台机器,每台机器都提供本地计算和存储. 1.2 Hadoop架构 Hadoop框架包括以下四个模块: Hadoop Common:这些是其他Hadoop模块所需的Java库和实用程序.这些

优雅的将hbase的数据导入hive表

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} wgx wgx 2 67 2016-04-02T15:15:00Z 2016-04-02T15:15:00Z 1 233 1332 11 3 1562 15.00 Clean Clean false 7.8 磅 0

Jsp显示HBase的数据

软件: Jdk1.7.eclipse ee.vmware安装好的CentOs6.5.Hadoop-2.6.0.HBase-0.99.2 1.建一个普通的动态Web程序,用导jar包运行,不用maven和ant. 2.把HBase和Hadoop的相应的jar包导进工程中: 主要是运行HBase  API,把指定表名和行键的内容读出来. 并添加 log4j.properties 文件. 3.创建一个servlet类,并创建jsp文件,把HBase的lib里的jar包拷进web的/web_ceshi2