Hadoop和HBase集群的JMX监控

程序员也能玩转的集群监控,程序员也能集群监控

点击上方蓝字进行关注的都是靓仔和仙女

为什么需要监控?

为了保证系统的稳定性,可靠性,可运维性。

  • 掌控集群的核心性能指标,了解集群的性能表现;

  • 集群出现问题时及时报警,便于运维同学及时修复问题;

  • 集群重要指标值异常时进行预警,将问题扼杀在摇篮中,不用等集群真正不可用时才采取行动;

  • 当集群出现问题时,监控系统可以帮助我们更快的定位问题和解决问题。

如何构建 HBase 集群监控系统?

公司有自己的监控系统,我们所要做的就是将 HBase
中我们关心的指标项发送到监控系统去,问题就转换为我们开发,采集并返回哪些
HBase 集群监控指标项。

HBase 集群监控指标

采集的监控数据主要包括以下几个方面:某台机器 OS 层面上的数据,例如
CPU、内存、磁盘、网络、load、网络流量等;某台
regionserver(或master)机器 jvm 的状态,例如关于线程的信息,GC
的次数和时间,内存使用状况,以及 ERROR、WARN、Fatal
事件出现的次数;regionserver(或 master)进程中的统计信息。

可以通过以下地址获取 HBase 提供的 JMX 信息的 web 页面

JMX web 页面的数据格式是json格式,信息很多!

OS 监控数据

HBase 中对于 OS 的监控数据,主要是 OperatingSystem
的对象来进行的,如下就是我提取出来的 JSON 信息。

其中比较重要的指标有 OpenFileDescriptorCount , FreePhysicalMemorySize ,
ProcessCpuLoad , SystemCpuLoad , AvailableProcessors , SystemLoadAverage

JVM 监控数据

Hbase 中对于 JVM 的监控数据,主要是 JvmMetrics
的对象来进行的,如下就是我提取出来的 JSON 信息,

JvmMetrics
主要统计的信息包括:内存的使用状态信息;GC的统计信息;线程的统计信息;以及事件的统计信息。

内存的统计信息主要是:JVM 当前已经使用的 NonHeapMemory
的大小、以及配置的 NonHeapMemory 的大小;JVM 当前已经使用的 HeapMemory
的大小、以及配置的 HeapMemory 的大小; JVM
运行时的可以使用的最大的内存的大小。

GC 的统计较为简单,仅统计了进程在固定间隔内 GC 的次数和花费的总时间。

线程的统计,主要是统计进程内当前线程的处于 NEW
、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
这六种状态下的线程数量。

对于事件的统计,主要统计固定时间间隔内的 Fatal、Error、Warn 以及 Info
的数量。(这块好像不怎么重要)

REGION SERVERS 健康

你也可以通过如下地址:

获得到 Region Servers 健康值:

MEMORYPOOL

从全部的 JSON 值中你会看到很多种 MemoryPool 值,比如 Par Eden Space
、CMS Perm Gen、Par Survivor Space、CMS Old Gen、Code Cache
,按需获取吧。

总结

任何一个服务的监控系统都是一个不断迭代,不断优化的过程,不可能一开始就做到最好。监控总是比问题发生来的更早一些,而每一次出问题,又进一步加强相应方面的监控,我们需要让监控系统从出问题时才报警到可能出现问题时就预警逐渐过渡,最终让监控系统成为我们保证系统稳定性的一个有力工具。

想更加详细,更加深入的了解集群其它方面的内容吗?

在这里部落告诉大家一个小秘密

今晚8:30

动脑学院  Five大神

将在腾讯课堂  动脑学院  免费Java公开课中

给大家详细讲解

《 分布式、集群环境互联网系统订单号生成策略 》

你只需要在今晚8:30的时候

点击文章最末 阅读原文

即可进行观看

推荐阅读  

高并发与分布式系统的基石–数据库读写分离实战

这就是学编程的下场…

论程序员与产品经理是怎么互掐起来的

如何假装成为一名好的程序员

来自部落的邀请

Java框架 Spring 核心机制

至程序员的情书

Java高级部落送你ofo小黄车60天免费骑行,还不来?

Facebook研发的Cassandra你用过吗?

给 Java开发者的10个大数据工具和框架

推荐程序员必备微信号 

点击上方蓝字进行关注的都是靓仔和仙女

说到对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就可以了。

如何构建 HBase 集群监控系统?

例如

公司有自己的监控系统,我们所要做的就是将
HBase
中我们关心的指标项发送到监控系统去,问题就转换为我们开发,采集并返回哪些
HBase 集群监控指标项。

HBase 集群监控指标

采集的监控数据主要包括以下几个方面:某台机器 OS
层面上的数据,例如 CPU、内存、磁盘、网络、load、网络流量等;某台
regionserver(或master)机器 jvm 的状态,例如关于线程的信息,GC
的次数和时间,内存使用状况,以及 ERROR、WARN、Fatal
事件出现的次数;regionserver(或 master)进程中的统计信息。

的地址替换成

可以通过以下地址获取 HBase 提供的 JMX
信息的 web 页面

图片 1

即可,其他如50030,50060等等,也依次类推,HBase的系统信息也可以用这种方法获取。

JMX web
页面的数据格式是json格式,信息很多!

返回值全部是JSON,非常便于自己进行处理。返回的信息也非常详细,内存状态,内存池状态,java堆信息等等。甚至还有操作系统信息,版本,JVM版本信息等等,很全面。

OS
监控数据

但是这个接口获取的JSON往往很大,而且对于某一项的监控,整个抓一串JSON信息就太浪费了。所以,这又是一个隐藏属性了,只在Hadoop源码中可以了解到。源码在src/core/org/apache/hadoop/jmx中。

HBase 中对于 OS 的监控数据,主要是
OperatingSystem 的对象来进行的,如下就是我提取出来的 JSON 信息。

JMXJsonServlet.java的一个public类

图片 2

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);
  }
}

其中比较重要的指标有
OpenFileDescriptorCount , FreePhysicalMemorySize , ProcessCpuLoad ,
SystemCpuLoad , AvailableProcessors , SystemLoadAverage

从源码中可以看到json的获取可以带有http验证,另外还可以有一个参数叫qry。这个参数的值就是在获取整个长JSON中每个”name”key所对应的名字。也就是,可以用

JVM
监控数据

MarkSweep

Hbase 中对于 JVM 的监控数据,主要是
JvmMetrics 的对象来进行的,如下就是我提取出来的 JSON 信息,

这种方式来获取关于JVM对内存垃圾回收的处理状态信息。很简单不是吗?

图片 3

在EasyHadoop的Agent中获取HDFS和MR的实时状态监控就是通过JMX的接口,处理代码如下:

JvmMetrics
主要统计的信息包括:内存的使用状态信息;GC的统计信息;线程的统计信息;以及事件的统计信息。

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
Copyright @ 2015-2019 ca88 版权所有
网站地图xml地图