[转帖]Hadoop和HBase集群的JMX监控_Hadoop,ERP及大数据讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Hadoop,ERP及大数据讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2954 | 回复: 0   主题: [转帖]Hadoop和HBase集群的JMX监控        下一篇 
刘伟
注册用户
等级:少校
经验:938
发帖:82
精华:0
注册:2013-6-24
状态:离线
发送短消息息给刘伟 加好友    发送短消息息给刘伟 发消息
发表于: IP:您无权察看 2013-6-28 10:39:33 | [全部帖] [楼主帖] 楼主

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

publicvoiddoGet(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 = newJsonFactory();
            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, newObjectName(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的接口,处理代码如下:

classEasyHadoopHandler:
defGetJmx(self,host,port,qry):
url ='http://'+host+':'+port+'/jmx?qry='+qry
jmx =urllib.urlopen(url)
json =jmx.read().replace('\n','')
jmx.close()
returnjson


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

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

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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论