阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

186次阅读
没有评论

共计 4395 个字符,预计需要花费 11 分钟才能阅读完成。

概述

说到对 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

————————————– 分割线 ————————————–

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

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

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-04/116179.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4395字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中