设为首页 收藏本站
查看: 1544|回复: 0

[经验分享] Hadoop和HBase集群的JMX监控

[复制链接]

尚未签到

发表于 2018-10-31 13:50:35 | 显示全部楼层 |阅读模式
  说到对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; ");
  
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等端口进行同样的处理,进行监控。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629043-1-1.html 上篇帖子: 从零开始安装Hadoop视频教程 下篇帖子: HADOOP 调试MR job
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表