Hadoop和HBase集群的JMX监控51CTO博客 - 凯时娱乐

Hadoop和HBase集群的JMX监控51CTO博客

2019-01-03 16:41:37 | 作者: 昂然 | 标签: 监控,集群,接口 | 浏览: 1813

提到对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类

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等端口进行相同的处理,进行监控。



版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章