现在的位置: 首页 > 综合 > 正文

Hadoop和HBase集群的JMX监控

2013年05月20日 ⁄ 综合 ⁄ 共 1677字 ⁄ 字号 评论关闭

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


其实Hadoop本身是带有监控接口的,各公司的发行版还有自己定制的接口,不过可能知道的人就不太多了。这个不详细的看文档和源码一般是找不到的,属于隐藏属性。事实上,我写的EasyHadoop管理界面里面就用到了这个监控的接口,能够对整个集群有一个比较详细的状态监控,目前还在不断扩展。下一步会实现对Java进程的Heap使用的监控,这样对整个集群的性能调优就会起到比较重要作用。


其实这个接口特别简单,但是非常详细,也非常方便,就是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版本信息等等,很全面。


但是这个接口获取的JSON往往很大,而且对于某一项的监控,整个抓一串JSON信息就太浪费了。所以,这又是一个隐藏属性了,只在Hadoop源码中可以了解到。源码在src/core/org/apache/hadoop/jmx中。


JMXJsonServlet.java的一个public类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void doGet(HttpServletRequest
request, HttpServletResponse response) {
  try {
    //
Do the authorization
    if (!HttpServer.hasAdministratorAccess(getServletContext(),
request,
        response))
{
      return;
    }
    response.setContentType("application/json;
charset=utf8"
);
    PrintWriter
writer = response.getWriter();
    JsonFactory
jsonFactory = 
new JsonFactory();
    JsonGenerator
jg = jsonFactory.createJsonGenerator(writer);
    jg.useDefaultPrettyPrinter();
    jg.writeStartObject();
    if (mBeanServer
== 
null)
{
      jg.writeStringField("result", "ERROR");
      jg.writeStringField("message", "No
MBeanServer could be found"
);
      jg.close();
      return;
    }
    String
qry = request.getParameter(
"qry");
    if (qry
== 

抱歉!评论已关闭.