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