Ambari-metric架构源码整理
在ambari,hdp升级测试过程中发现后台任务执行完毕了,但是前台进度条未完成,特此分析ambari-metrics模块代码
1、Collector
Ambari中的Collector是其内置的角色,主要提供两个功能,一方面将 Metrics Monitor 和 Metrics Sink 汇报上来的监控信息存储到 HBase 中,另一方面提供监控信息查询接口,供 Ambari Server 进行查询。 其角色功能在Ambari设计中的功能如下图:
2、metrics collector和metrics system区别
-
Metrics Collector:如上所述,主要提供两个功能,一方面将 Metrics Monitor 和 Metrics Sink 汇报上来的监控信息存储到 HBase 中,另一方面提供监控信息查询接口,供 Ambari Server 进行查询。
-
Ambari Metrics System (“AMS”):
The built-in metrics collection system for Ambari.,意为Ambari内置的指标系统 -
metrics system 每个Hadoop的进程也都内置这么一个metrics system角色,主要是收集指标数据并转发等处理,ambari中的MetricsSystem主要作用是用于接收Hadoop等sink发送的数据
3、Ambari-Metrics代码结构介绍
ambari-metrics-host-monitoring 主要负责主机监控,通过python实现,主要 psutil库
ambari-metrics-grafana Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器。主要处理图标显示。
ambari-metrics-hadoop-sink 主要处理hadoop的数据采集,并将采集的数据发送给collector。
ambari-metrics-timelineservice 主要负责数据聚合,数据存储,数据查询,为总入口。
4、ambari的metrics collector初始化流程
org.apache.hadoop.metrics2.sink.timeline.HadoopTimelineMetricsSink#init
-
获取hostname
通过MetricCollectorHAHelper 根据集群的存储模式,选择zk里保存的collector链接 -
获取serviceName
LOG.info("Identified hostname = " + hostName + ", serviceName = " + serviceName); -
初始化collector写入策略
// Initialize the collector write strategy super.init();
-
加载collector配置(协议、主机、端口)
-
判断主机是否为空
-
判断协议是否https,是的话加载相应认证配置
构造collectorUri和containerMetricsUri -
打印地址
-
读取metricsCache配置并构造metricsCache
-
读取tag配置并过滤对应的key
如果有指定rpc端口进行设定Iterator<String> it = (Iterator<String>) conf.getKeys(); while (it.hasNext()) { String propertyName = it.next(); if (propertyName != null) { if (propertyName.startsWith(TAGS_FOR_PREFIX_PROPERTY_PREFIX)) { String contextName = propertyName.substring(TAGS_FOR_PREFIX_PROPERTY_PREFIX.length()); String[] tags = conf.getStringArray(propertyName); boolean useAllTags = false; Set<String> set = null; if (tags.length > 0) { set = new HashSet<String>(); for (String tag : tags) { tag = tag.trim(); /* |=:两个二进制对应位都为0时,结果等于0,否则结果等于1;----按位或 &=:两个二进制的对应位都为1时,结果为1,否则结果等于0;----按位与 ^=:两个二进制的对应位相同,结果为0,否则结果为1。-------- 按位异或 */ useAllTags |= tag.equals("*"); if (tag.length() > 0) { set.add(tag); } } if (useAllTags) { set = null; } } useTagsMap.put(contextName, set); } // Customized RPC ports if (propertyName.startsWith(RPC_METRIC_PREFIX)) { // metric.rpc.client.port int beginIdx = RPC_METRIC_PREFIX.length() + 1; String suffixStr = propertyName.substring(beginIdx); // client.port String configPrefix = suffixStr.substring(0, suffixStr.indexOf(".")); // client rpcPortSuffixes.put(conf.getString(propertyName).trim(), configPrefix.trim()); } } } if (!rpcPortSuffixes.isEmpty()) { LOG.info("RPC port properties configured: " + rpcPortSuffixes); }
启动startWebApp(实际是一个jetty的http server
在如下类中
org.apache.hadoop.yarn.server.applicationhistoryservice.ApplicationHistoryServer#startWebApp
5、AMS-Hbase
5.1、tables
默认命名空间default
5.2、METRIC_RECORD表
该表是所有表中唯一存储实际metrics数据的表,其它表都是在此表的基础之上进行时间段的相应统计。
- 针对采集的hosts指标,即由monitor发送的指标值
- 针对采集的hadoopsink指标