前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop JMX监控和预警

Hadoop JMX监控和预警

作者头像
大数据学习与分享
发布2021-07-15 15:32:09
1.6K0
发布2021-07-15 15:32:09
举报

Hadoop slave node会定期发出一些metrics信息来反映服务的健康状况,服务团队可以通过查看这些metrics来了解服务是否处于健康状态,并回溯了解历史表现。一些典型的用例是:

  1. 对HBase集群中RegionServer(堆使用情况)、RPC处理metrics和region有效性等预先警告
  2. 通过metrics历史dashboard进行故障排除
  3. 来自客户端的NameNode RPC流量非常高,确定客户端的来源,并从审核日志中grep用户
  4. 用户可以灵活地为每个监控的metric设置阈值,并在不重写或从头创建策略的情况下获取警报通知
  5. 关于生成异常RPC流量的HDFS客户端的通知
  6. 提取RPC处理时间异常的DN/RS列表

Metrics收集器和Agent

通常我们获取Hadoop集群 metrics信息,主要通过两种方式进行:

1.在每个节点中部署一个独立的JMX client

以HBase集群为例,监控HBase集群服务器堆使用情况、RegionServer的RPC处理metrics等。那么可以在每个从属节点(或者是选定的一个节点集)部署JMX client。

2.在Hadoop的metrics系统中添加JMX sink

JMX sink需要根据Hadoop的metrics接口开发,并嵌入Hadoop运行时环境中。

对于通过构建JMX client来收集JMX metrics,那么最好有一个agent(代理)来监控JMX client是否工作良好,否则如果有些JMX client停止工作,可能会出现一些JMX数据丢失。

如果我们使用JMX sink收集数据,则JMX client不需要代理,毕竟数据收集生命周期与守护程序生命周期相同。

对于收集的metrics数据,建议先写入Kafka,作为一个"分布式缓存层",以将JMX client和metrics最终的存储系统解偶,避免JMX数据的存储延迟。

JMX监控和预警

目前Hadoop集群监控的方式很多,比如Restful API,具体Hadoop组件内置的API、JMX等。但具体采取哪种方式,则取决于我们的实际生产需求。

Hadoop的JMX提供了诸如Cluster、NameNode、JVM、FSQueue等Metrics信息,而且获取它也是非常地方便。比如想获取NameNode相关的JMX,我们可以直接请求http://ip:50070/jmx(ip为HDFS集群中active NameNode所在节点IP地址)获取JMX信息(如果想获取Yarn的JMX,则将ip换为active ResourceManager节点所在节点地址,端口改为8088请求即可)。

JMX相关信息的接口是在类org.apache.hadoop.jmx.JMXJsonServlet中实现的,返回的信息是json结构。示例:

代码语言:javascript
复制
http://bigdatalearnshare01.com:50070/jmx

返回信息:

代码语言:javascript
复制
{
    "beans": [
        {
            "name": "Hadoop:service=NameNode,name=JvmMetrics",
            "modelerType": "JvmMetrics",
            "tag.Context": "jvm",
            "tag.ProcessName": "NameNode",
            "tag.SessionId": null,
            "tag.Hostname": "bigdatalearnshare01.com",
            "MemNonHeapUsedM": 106.66022,
            "MemNonHeapCommittedM": 109.15625,
            "MemNonHeapMaxM": -1.0,
            "MemHeapUsedM": 425.97473,
            "MemHeapCommittedM": 1011.25,
            "MemHeapMaxM": 1011.25,
            "MemMaxM": 1011.25,
            "GcCountParNew": 172404,
            "GcTimeMillisParNew": 923008,
            "GcCountConcurrentMarkSweep": 103,
            "GcTimeMillisConcurrentMarkSweep": 14309,
            "GcCount": 172507,
            "GcTimeMillis": 937317,
            "GcNumWarnThresholdExceeded": 0,
            "GcNumInfoThresholdExceeded": 1,
            "GcTotalExtraSleepTime": 70879,
            "ThreadsNew": 0,
            "ThreadsRunnable": 7,
            "ThreadsBlocked": 0,
            "ThreadsWaiting": 11,
            "ThreadsTimedWaiting": 72,
            "ThreadsTerminated": 0,
            "LogFatal": 0,
            "LogError": 0,
            "LogWarn": 308137,
            "LogInfo": 39725604
        },
        -- 此处省略一万字
        ......
}

从上面的结果看出,如果直接请求:

代码语言:javascript
复制
http://bigdatalearnshare01.com:50070/jmx

返回的信息很庞大,但其中有很多我们不需要的冗余信息。如果我们只想获取NameNode状态怎么办呢?这就要介绍JMXJsonServlet支持的参数:qry。

qry

回到刚才的问题,只想获取NameNode状态怎么办呢?其实很简单,直接请求下述URL即可:

代码语言:javascript
复制
http://bigdatalearnshare01.com:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus

返回信息:

代码语言:javascript
复制
{
    "beans": [
        {
            "name": "Hadoop:service=NameNode,name=NameNodeStatus",
            "modelerType": "org.apache.hadoop.hdfs.server.namenode.NameNode",
            "NNRole": "NameNode",
            "HostAndPort": "bigdatalearnshare01.com:8020",
            "SecurityEnabled": false,
            "LastHATransitionTime": 1618163473872,
            "BytesWithFutureGenerationStamps": 0,
            "SlowPeersReport": null,
            "State": "active"
        }
    ]
}

我们也可以指定通配符,比如:http://bigdatalearnshare01.com:50070/jmx?qry=Hadoop:*将会返回所有name为Hadoop:开头的JMX信息。

如果查询的添加没有找到,将会返回{}。在Hadoop内部,这个参数的应用可参考接口MBeanServer中的方法:

代码语言:javascript
复制
public Set<ObjectName> queryNames(ObjectName name, QueryExp query)

除参数qry外,JMXJsonServlet还支持参数callback、get。

callback

用于需要JSONP响应的请求。JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决http请求的跨域访问问题。使用这个参数之后HTTP头的ContentType变成了application/javascript; charset=utf8,并且返回的Json被callback参数的值和()包围了(JSONP的一种方式处理)。

代码语言:javascript
复制
访问示例的URL:
http://bigdatalearnshare01.com:50070/jmx?callback=bigdatalearnshare(bigdatalearnshare在这里是指用户名)

get

如果我们想获取JMX某个属性的值,可以使用get参数。这个参数的值要求是MXBeanName::AttributeName格式的。

以Yarn为例,如果想获取某个队列的tag.Queue属性的值,我们可以这么请求:

代码语言:javascript
复制
http://bigdatalearnshare01.com:8088/jmx?get=Hadoop:service=ResourceManager,name=QueueMetrics,q0=root,q1=bigdata_test::tag.Queue

返回信息:

代码语言:javascript
复制
{
    "beans": [
        {
            "name": "Hadoop:service=ResourceManager,name=QueueMetrics,q0=root,q1=g4_q450",
            "modelerType": "QueueMetrics,q0=root,q1=g4_q450",
            "tag.Queue": "root.g4_q450"
        }
    ]
}

如果get参数值的格式不对,服务器将返回异常信息:

代码语言:javascript
复制
{
    "result": "ERROR",
    "message": "query format is not as expected."
}

我们可以重新解析这些JMX信息,从而可以监控Hadoop集群、队列、jvm使用情况等。

推荐文章: Linux性能检测常用的10个基本命令 Hadoop支持的压缩格式对比和应用场景以及Hadoop native库 如何有效恢复误删的HDFS文件


关注大数据学习与分享,获取更多技术干货

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据学习与分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档