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等端口進行一樣的處理,進行監控。

相關文章
相關標籤/搜索