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指標