Metrics Collector 架構圖,由圖中看,主要有4部分:
TimelineWebServices:是一個Web服務,一方面提供 Metrics Monitor 和 Metrics Sink 匯報監控數據的 POST 接口;另一方面提供 Ambari Server 查詢監控數據的 GET 接口。
TimelineMetricStore:周期性聚合數據。
Phoenix:是一個開源工具庫,可以把 SQL 語句轉換為 HBase 的操作語句。
HBase:存儲監控數據的地方,HBase 有兩種工作模式:Embedded Mode,單機模式,數據存儲在本地文件系統中;Distributed Mode,分布式模式,數據存儲在 HDFS 中。目前 Metrics 服務默認是 Embedded Mode,安裝之后可通過修改參數進行調整。
簡述一下 Metrics Collector 的工作流程:
1、存儲監控數據:Metrics Monitor/Sink,通過 POST 接口匯報監控數據,TimelineWebServices 根據收到的監控數據生成 SQL 語句,然后通過 Phoenix 把 SQL 轉換為 HBase 的操作語句,把監控數據存儲到 HBase 當中(原始監控數據都存儲到 METRIC_RECORD 表中)。
2、查詢監控數據:Ambari Server 根據 GET 接口查詢監控數據,TimelineWebServices 根據查詢條件生成 SQL 語句,然后通過 Phoenix 把 SQL 轉換為 HBase 的操作語句,查詢出符合條件的監控數據。
3、周期性聚合數據:Metrics Monitor 和 Metrics Sink 上傳的原始監控數據粒度是秒級的,TimelineMetricStore 通過運行周期任務,可以聚合出分鍾級、小時級、天級的監控數據。
Metrics 表分為兩類:主機級別和集群級別,然后不同粒度是不同的表,具體如下:
Host 級別:
METRIC_RECORD 秒級
METRIC_RECORD_MINUTE 分級
METRIC_RECORD_HOURLY 時級
METRIC_RECORD_DAILY 天級
Cluster 級別:
METRIC_AGGREGATE 分級
METRIC_AGGREGATE_HOURLY 時級
METRIC_AGGREGATE_DAILY 天級
簡單介紹一下 METRIC_RECORD 的表結構,其他表的結構大同小異。
METRIC_RECORD 表結構:
METRIC_NAME 指標名
HOSTNAME 主機名
APP_ID 應用名
INSTANCE_ID 實例ID,如果一台 HOST 安裝了多個同樣的應用
UNITS 數據類型,如:Number
SERVER_TIME 記錄保存時間
START_TIME 本次 METRICS 最小的時間
METRICS 具體指標,如:{"1490605303":"149491.1875","1490605313":"149591.1875"}
METRIC_SUM METRICS value的總數
METRIC_COUNT METRICS 記錄的數量
METRIC_MAX METRICS 中最大的 value
METRIC_MIN METRICS 中最小的 value
簡單介紹一下 數據聚合 的實現方式,是通過執行如下的 SQL 進行聚合的:
Host 級別數據聚合:
UPSERT INTO 'METRIC_RECORD_MINUTE' (METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, SERVER_TIME, UNITS, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) SELECT METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, MAX(SERVER_TIME), UNITS, SUM(METRIC_SUM), SUM(METRIC_COUNT), MAX(METRIC_MAX), MIN(METRIC_MIN) FROM 'METRIC_RECORD' WHERE SERVER_TIME >= 'startTime' AND SERVER_TIME < 'endTime' GROUP BY METRIC_NAME, HOSTNAME, APP_ID, INSTANCE_ID, UNITS
Cluster 級別數據聚合:
UPSERT INTO 'METRIC_AGGREGATE' (METRIC_NAME, APP_ID, INSTANCE_ID, SERVER_TIME, UNITS, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) SELECT METRIC_NAME, APP_ID, INSTANCE_ID, MAX(SERVER_TIME), UNITS, SUM(METRIC_SUM), SUM(METRIC_SUM), MAX(METRIC_MAX), MIN(METRIC_MIN) FROM METRIC_RECORD WHERE SERVER_TIME >= 'startTime' AND SERVER_TIME < 'endTime' GROUP BY METRIC_NAME, APP_ID, INSTANCE_ID, UNITS