TT Bigdata TT Bigdata
首页
GitHub (opens new window)
JaneTTR

JaneTTR

数据酿造智慧,每一滴都是沉淀!
  • Ambari 深度专题

  • Bigtop 方法论

  • 自定义集成

  • Ambari Server 与 Web

  • Ambari Metrics

    • 试读&介绍

    • Ambari-Metrics解读【简写AMS】

      • 源码下载及环境初始化
      • 项目目录及模块解读
      • AMS-Collector剖析

      • AMS-Collector表结构实战

      • AMS-Collector-元数据-接口实战

        • [控制器类] — API请求逻辑梳理
        • [/metrics/metadata] — 元数据查询和使用
        • [/metrics/metadata] — 请求完整链路解读
        • [/metrics/metadata] — 缓存数据装载
          • 一、承接上节:缓存从哪来?
          • 二、核心调用链
            • 1、缓存初始化
            • 2、数据来源:getMetadataFromStore
            • 3、Phoenix 层查询
          • 三、SQL 定义
          • 四、执行逻辑回顾
      • AMS-Collector-指标查询-接口实战

      • AMS-Collector-普通指标写入-接口实战

      • AMS-Collector-聚合指标写入-接口实战

  • Ambari Plus 思考

  • Redis集成实战

  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Ambari Metrics
  • Ambari-Metrics解读【简写AMS】
  • AMS-Collector-元数据-接口实战
JaneTTR
2025-09-12
目录
一、承接上节:缓存从哪来?
二、核心调用链
1、缓存初始化
2、数据来源:getMetadataFromStore
3、Phoenix 层查询
三、SQL 定义
四、执行逻辑回顾

[/metrics/metadata] — 缓存数据装载Phoenix

# 一、承接上节:缓存从哪来?

在上一节中,我们已经明确了:
请求 /metrics/metadata 时,数据是直接从 METADATA_CACHE 中返回的。

那么问题来了:METADATA_CACHE 又是何时、如何被填充的?

答案就在 TimelineMetricMetadataManager.initializeMetadata()。

image-20250912112253904

# 二、核心调用链

# 1、缓存初始化

Map<TimelineMetricMetadataKey, TimelineMetricMetadata> metadata = getMetadataFromStore();
METADATA_CACHE.putAll(metadata);
1
2

在 initializeMetadata 中,会调用 getMetadataFromStore(),将查询结果一次性 putAll 到缓存中。

# 2、数据来源:getMetadataFromStore

Map<TimelineMetricMetadataKey, TimelineMetricMetadata> getMetadataFromStore() throws SQLException {
    return hbaseAccessor.getTimelineMetricMetadata();
}
1
2
3

可以看到,真正的查询交给了 PhoenixHBaseAccessor。

# 3、Phoenix 层查询

在 PhoenixHBaseAccessor 中,定义了完整的查询逻辑:

try (PreparedStatement stmt = conn.prepareStatement(GET_METRIC_METADATA_SQL);
     ResultSet rs = stmt.executeQuery()) {

    while (rs.next()) {
        String metricName = rs.getString("METRIC_NAME");
        String appId = rs.getString("APP_ID");
        String instanceId = rs.getString("INSTANCE_ID");

        TimelineMetricMetadata metadata =
            new TimelineMetricMetadata(metricName, appId, instanceId);

        metadata.setUuid(checkForNull(rs.getBytes("UUID")));
        metadata.setUnits(rs.getString("UNITS"));
        metadata.setType(rs.getString("TYPE"));
        metadata.setStartTime(rs.getLong("START_TIME"));
        metadata.setSupportsAggregates(rs.getBoolean("SUPPORTS_AGGREGATION"));
        metadata.setWhitelisted(rs.getBoolean("IS_WHITELISTED"));

        TimelineMetricMetadataKey key =
            new TimelineMetricMetadataKey(metricName, appId, instanceId);
        metadata.setPersisted(true);

        metadataMap.put(key, metadata);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

这里的核心步骤:

  1. 执行 SQL
  2. 遍历 ResultSet
  3. 封装为 TimelineMetricMetadata
  4. 与 Key 组装为 Map,最终返回

# 三、SQL 定义

查询所用的 SQL 定义在 PhoenixTransactSQL 中:

public static final String GET_METRIC_METADATA_SQL =
    "SELECT METRIC_NAME, APP_ID, INSTANCE_ID, UUID, UNITS, TYPE, START_TIME, " +
    "SUPPORTS_AGGREGATION, IS_WHITELISTED FROM METRICS_METADATA_UUID";
1
2
3

提示

数据源就是 METRICS_METADATA_UUID 表。 该表存储了 Collector 内所有监控指标的“元信息”,是 UI 与 API 查询的基础。

# 四、执行逻辑回顾

整个装载过程可归纳为以下四步:

步骤 方法/位置 作用
1️⃣ initializeMetadata 触发缓存加载逻辑
2️⃣ getMetadataFromStore 调用 PhoenixHBaseAccessor
3️⃣ GET_METRIC_METADATA_SQL 查询 HBase 的 METRICS_METADATA_UUID 表
4️⃣ putAll(metadata) 写入 ConcurrentHashMap 缓存
#Ambari-Metrics#源码解析#Ambari
[/metrics/metadata] — 请求完整链路解读
[/metrics] — 监控数据接口查询方法

← [/metrics/metadata] — 请求完整链路解读 [/metrics] — 监控数据接口查询方法→

最近更新
01
当前版本 2026/08
08-29
02
把 Ambari Server HA 稳稳地跑起来
08-17
03
从一次启用操作追到主备就绪
08-17
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式