您当前的位置:首页 > hadoop

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

概述nkklinux系统宝典

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

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

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

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

例如,将nkklinux系统宝典

http://your_namenode:50070/dfshealth.jsp的地址替换成http://your_namenode:50070/jmxnkklinux系统宝典

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

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

实现nkklinux系统宝典

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

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

例如http://your_namenode:60010/jmx?qry=Hadoop:service=HBase,name=Master,sub=Servernkklinux系统宝典

Maven配置nkklinux系统宝典

 nkklinux系统宝典

        <dependency>nkklinux系统宝典

            <groupId>commons-httpclient</groupId>nkklinux系统宝典

            <artifactId>commons-httpclient</artifactId>nkklinux系统宝典

            <version>3.1</version>nkklinux系统宝典

        </dependency>nkklinux系统宝典

        <dependency>nkklinux系统宝典

            <groupId>org.json</groupId>nkklinux系统宝典

            <artifactId>json</artifactId>nkklinux系统宝典

            <version>20090211</version>nkklinux系统宝典

        </dependency>nkklinux系统宝典

Java类nkklinux系统宝典

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

/**nkklinux系统宝典
 * 作为HBase Master监控信息的sourcenkklinux系统宝典
 *nkklinux系统宝典
 * @author aihua.sunnkklinux系统宝典
 * @date 2015/4/6nkklinux系统宝典
 * @since V1.0nkklinux系统宝典
 */nkklinux系统宝典

import com.eric.agent.flume.model.HMasterRoleInfo;nkklinux系统宝典
import com.eric.agent.utils.AgentConstants;nkklinux系统宝典
import com.eric.agent.utils.MetricDataUtils;nkklinux系统宝典
import org.json.JSONException;nkklinux系统宝典
import org.json.JSONObject;nkklinux系统宝典
import org.slf4j.Logger;nkklinux系统宝典
import org.slf4j.LoggerFactory;nkklinux系统宝典

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

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

        JSONObject serverJson = qryJSonObjectFromJMX(URL, server);nkklinux系统宝典
        JSONObject assignJson = qryJSonObjectFromJMX(URL, assignment);nkklinux系统宝典

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

        } catch (JSONException e) {nkklinux系统宝典
            e.printStackTrace();nkklinux系统宝典
        }nkklinux系统宝典
        return monitorDataPoint.toString();nkklinux系统宝典
    }nkklinux系统宝典

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

    /**nkklinux系统宝典

    * 通过jmx获取监控数据nkklinux系统宝典

    *nkklinux系统宝典

    * @param URLnkklinux系统宝典

    * @param objectNamenkklinux系统宝典

    * @returnnkklinux系统宝典

    */nkklinux系统宝典

    public static JSONObject qryJSonObjectFromJMX(String URL, String objectName) {nkklinux系统宝典

        JSONObject jsonObject = null;nkklinux系统宝典

        try {nkklinux系统宝典

            StringBuilder sb = new StringBuilder(URL);nkklinux系统宝典

            sb.append("?qry=");nkklinux系统宝典

            sb.append(objectName);nkklinux系统宝典

            GetMethod getMethod = new GetMethod(sb.toString());nkklinux系统宝典

            int statusCode = httpClient.executeMethod(getMethod);nkklinux系统宝典

            String jsonStr = new String(getMethod.getResponseBody());nkklinux系统宝典

            jsonObject = new JSONObject(removeDuplicateContext(jsonStr)).getJSONArray("beans").getJSONObject(0);nkklinux系统宝典

        } catch (JSONException e) {nkklinux系统宝典

            e.printStackTrace();nkklinux系统宝典

        } catch (Exception e) {nkklinux系统宝典

            e.printStackTrace();nkklinux系统宝典

        }nkklinux系统宝典

        return jsonObject;nkklinux系统宝典

    }nkklinux系统宝典
}nkklinux系统宝典

参考文章nkklinux系统宝典

JMXJsonServlet 介绍nkklinux系统宝典
http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/http/jmx/JMXJsonServlet.htmlnkklinux系统宝典
Hadoop指标介绍nkklinux系统宝典
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/Metrics.html#rpcnkklinux系统宝典

--------------------------------------分割线 --------------------------------------nkklinux系统宝典

14.04下Hadoop2.4.1单机/伪分布式安装配置教程  nkklinux系统宝典

安装和配置Hadoop2.2.0  nkklinux系统宝典

Ubuntu 13.04上搭建Hadoop环境 nkklinux系统宝典

Ubuntu 12.10 +Hadoop 1.2.1版本集群配置 nkklinux系统宝典

Ubuntu上搭建Hadoop环境(单机模式+伪分布模式) nkklinux系统宝典

Ubuntu下Hadoop环境的配置 nkklinux系统宝典

单机版搭建Hadoop环境图文教程详解 nkklinux系统宝典

搭建Hadoop环境(在Winodws环境下用虚拟机虚拟两个Ubuntu系nkklinux系统宝典

更多Hadoop相关信息见 专题页面 nkklinux系统宝典



沪ICP备10206494号-4