美文网首页Hadoop实操
0006-Zookeeper指标分析

0006-Zookeeper指标分析

作者: Hadoop实操 | 来源:发表于2018-12-09 12:20 被阅读22次

Fayson的github: https://github.com/fayson/cdhproject
推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f,或者扫描文末二维码。

1. 问题描述

通过CDH管理平台,进入Zookeeper管理界面,Zookeeper的平均请求延迟、最小请求延迟、最大请求延迟指标趋势图维持不变,指标数据异常。

2.问题复现

  • 登录CDH平台,进入Zookeeper管理页面,查看Zookeeper各服务器状态,页面如下:


  • 查看如下指标

平均请求延迟、最小请求延迟、最大请求延迟三个指标维持不变,指标异常。



3.问题分析

3.1.指标来源

  • 该指标是CDH通过ZookeeperJMX方式获取,具体参考Zookeeper官网
http://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperJMX.html#ch_jmx
  • 通过命令方式获取Zookeeper指标信息
[root@ip-172-31-10-61 ~]# echo mntr |nc 172.31.10.61 2181
zk_version      3.4.5-cdh5.10.0--1, built on 01/20/2017 20:10 GMT
zk_avg_latency  0
zk_max_latency  10
zk_min_latency  0
zk_packets_received     30569
zk_packets_sent 31521
zk_num_alive_connections        7
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count  62
zk_watch_count  14
zk_ephemerals_count     9
zk_approximate_data_size        3049
zk_open_file_descriptor_count   43
zk_max_file_descriptor_count    32768

通过以上分析可以判断指标数据非CDH计算得来,而是Zookeeper计算,排除CM问题;

3.2.分析Zookeeper源码

  • 命令行调用Zookeeper监控指标代码片段(MonitorCommand.java)
public void commandRun() {
        if (!isZKServerRunning()) {
            pw.println(ZK_NOT_SERVING);
            return;
        }
        ZKDatabase zkdb = zkServer.getZKDatabase();
        ServerStats stats = zkServer.serverStats();

        print("version", Version.getFullVersion());

        print("avg_latency", stats.getAvgLatency());
        print("max_latency", stats.getMaxLatency());
        print("min_latency", stats.getMinLatency());

        print("packets_received", stats.getPacketsReceived());
        print("packets_sent", stats.getPacketsSent());
        print("num_alive_connections", stats.getNumAliveClientConnections());

        print("outstanding_requests", stats.getOutstandingRequests());

        print("server_state", stats.getServerState());
        print("znode_count", zkdb.getNodeCount());

        print("watch_count", zkdb.getDataTree().getWatchCount());
        print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount());
        print("approximate_data_size", zkdb.getDataTree().approximateDataSize());

        OSMXBean osMbean = new OSMXBean();
        if (osMbean != null && osMbean.getUnix() == true) {
            print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount());
            print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount());
        }

        if (stats.getServerState().equals("leader")) {
            Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader();

            print("followers", leader.getLearners().size());
            print("synced_followers", leader.getForwardingFollowers().size());
            print("pending_syncs", leader.getNumPendingSyncs());
        }
}

通过查看源码,指标数据是通过ServerStats获取“请求延迟”指标

  • 分析ServerStats代码,代码片段(ServerStats.java)
//更新minLatency、maxLatency、count、totalLatency数据
synchronized void updateLatency(long requestCreateTime) {
        long latency = Time.currentElapsedTime() - requestCreateTime;
        totalLatency += latency;
        count++;
        if (latency < minLatency) {
            minLatency = latency;
        }
        if (latency > maxLatency) {
            maxLatency = latency;
        }
}
//获取avgLatency指标
synchronized public long getAvgLatency() {
    if (count != 0) {
        return totalLatency / count;
    }
    return 0;
}

ServerStats只提供了updateLatency方法来更新maxLatency和minLatency指标。

  • 调用更新ServerStats方法代码片段如下:(FinalRequestProcessor.java)
case OpCode.ping: {
                zks.serverStats().updateLatency(request.createTime);

                lastOp = "PING";
                cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp,
                        request.createTime, Time.currentElapsedTime());

                cnxn.sendResponse(new ReplyHeader(-2,
                        zks.getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response");
                return;
            }
            case OpCode.createSession: {
                zks.serverStats().updateLatency(request.createTime);

                lastOp = "SESS";
                cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp,
                        request.createTime, Time.currentElapsedTime());

                zks.finishSessionInit(request.cnxn, true);
                return;
            }

3.3.异常指标分析

通过分析代码,maxLatency和minLatency指标数据在Zookeeper服务器启动记录每次Request的指标数据;

在获取Zookeeper服务器的的maxLatency和minLatency指标记录服务器所有请求中最大请求延迟和最小请求延迟;

  • 最大请求延迟指标

Zookeeper服务器1,在通过A请求更新ServerStats的maxLatency的指标值为100ms,在之后所有请求均未超过maxLatency为100ms的值。CDH平台每次获取Zookeeper服务器1的maxLatency指标时均为100ms,因此导致文章开头CDH平台Zookeeper的maxLatency指标维持不变“异常”。

  • 最小请求延迟指标

Zookeeper服务器1,在通过A请求后更新ServerStats的minLatency的指标值为0ms,在之后所有请求均未小于minLatency为0ms的值。CDH平台每次获取Zookeeper服务器1的minLatency指标时均为0ms,因此导致文章开头CDH平台Zookeeper的minLatency指标为0ms维持不变的“异常”。

  • 平均请求延迟指标

Zookeeper服务器1累计所有请求的延迟时间(totalLatency),累计总共请求次数(count),通过totalLatency/count获取avgLatency指标。至于avgLatency指标持续维持为0ms,由于totalLatency <count导致。

由此推断多次请求Latency的延迟为0ms。


为天地立心,为生民立命,为往圣继绝学,为万世开太平。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。



原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

相关文章

  • 0006-Zookeeper指标分析

    Fayson的github: https://github.com/fayson/cdhproject推荐关注微信...

  • 怎么分析企业营运能力?用这个分析模板试试

    企业在财务分析中离不开对各项财务指标的分析,例如盈利能力指标的分析、运营能力指标的分析、偿债能力指标的分析等等。以...

  • 盈利能力指标分析不会做?用BI报表看看

    财务分析中离不开各种指标的分析,比如偿债能力指标、运营能力指标、盈利能力指标等。通过指标数据的趋势变化等分析,使得...

  • 指标计算字典

    一、用户类指标 二、复合指标 三、事件与页面指标 四、Crash分析指标

  • 数据分析思维读书笔记

    推荐书籍:《数据分析思维:分析方法和业务知识》 一、业务指标: 1.1 指标分类: 1.2 如何选择指标: · 北...

  • 买手货品管理篇(一)

    产品日常管理 存销比分析 库存结构分析 平均销售折扣分析 货品整合 售罄率分析 货品的管理指标 货品分析的重要指标...

  • 微专业--获取数据

    网站数据指标 网站分析工具alexa、google analytics、百度统计、cnzz网站分析 关键的指标++...

  • FM算法模型评估

    目录一、FM算法简介二、评估方法三、参数指标分析1.误差分析2.ndcg指标分析3.查准率分析4.查全率分析四、分...

  • 体外诊断试剂的性能指标

    体外诊断产品的性能指标主要包括分析性能指标、临床性能指标和注册检验指标,其中分析性能指标是体外诊断试剂最重要的评价...

  • 容器监控实践—K8S常用指标分析

    基于 RED方法 和 USE 方法 对以下四类指标进行分析: cadvisor 指标分析 node-exporte...

网友评论

    本文标题:0006-Zookeeper指标分析

    本文链接:https://www.haomeiwen.com/subject/oobhhqtx.html