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