Hadoop和HBase集群的JMX监控

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


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


其实这个接口特别简单,可是很是详细,也很是方便,就是JMX。python


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

例如json

app

http://your_namenode:50070/dfshealth.jspjsp

的地址替换成ide

http://your_namenode:50070/jmx 工具

便可,其余如50030,50060等等,也依次类推,HBase的系统信息也能够用这种方法获取。oop


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


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


JMXJsonServlet.java的一个public类

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 == null) {
      qry = "*:*";
    }
    listBeans(jg, new ObjectName(qry));
    jg.close();
  } catch (IOException e) {
    LOG.error("Caught an exception while processing JMX request", e);
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  } catch (MalformedObjectNameException e) {
    LOG.error("Caught an exception while processing JMX request", e);
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
  }
}


从源码中能够看到json的获取能够带有http验证,另外还能够有一个参数叫qry。这个参数的值就是在获取整个长JSON中每一个"name"key所对应的名字。也就是,能够用

http://your_tasktracker:50060/jmx?qry=GarbageCollector,name=PS MarkSweep

这种方式来获取关于JVM对内存垃圾回收的处理状态信息。很简单不是吗?


在EasyHadoop的Agent中获取HDFS和MR的实时状态监控就是经过JMX的接口,处理代码以下:


class EasyHadoopHandler:
    def GetJmx(self,host,port,qry):
        url = 'http://'+host+':'+port+'/jmx?qry='+qry
        jmx = urllib.urlopen(url)
        json = jmx.read().replace('\n','')
        jmx.close()
        return json


由Central主动发起查询JMX的请求,Agent在获取了相关的监控信息后将json返回给Central,Central再用js将数据进行绘图实时返回给用户。


各发行版还有不一样的监控接口,例如cloudera版还多加了一个叫metrics也不metrics2的接口。


这样来本身作Hadoop的监控,就比光使用cacti和ganglia就详细了许多。HBase也可对60010等端口进行一样的处理,进行监控。

相关文章
相关标签/搜索