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-元数据-接口实战

      • AMS-Collector-指标查询-接口实战

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

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

        • [/metrics/aggregated] — 反向分析接口参数
        • [/metrics/aggregated] — 聚合指标触发逻辑溯源
          • 一、起点:saveHostAggregateRecords 的战略意义
          • 二、TimelineMetricHostAggregator:第一个落点
            • 1、调用关系
            • 2、设计思想
          • 三、run 方法与多线程调度
          • 四、聚合器家族谱系
          • 五、initializeSubsystem:一切的起点
          • 六、scheduleAggregatorThread:核心逻辑
            • 核心要点
          • 七、调用链可视化
        • [/metrics/aggregated] — 分时日表数据溯源
        • [/metrics/aggregated] — 聚合数据范围
  • Ambari Plus 思考

  • Redis集成实战

  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Ambari Metrics
  • Ambari-Metrics解读【简写AMS】
  • AMS-Collector-聚合指标写入-接口实战
JaneTTR
2025-09-17
目录
一、起点:saveHostAggregateRecords 的战略意义
二、TimelineMetricHostAggregator:第一个落点
1、调用关系
2、设计思想
三、run 方法与多线程调度
四、聚合器家族谱系
五、initializeSubsystem:一切的起点
六、scheduleAggregatorThread:核心逻辑
核心要点
七、调用链可视化

[/metrics/aggregated] — 聚合指标触发逻辑溯源

# 一、起点:saveHostAggregateRecords 的战略意义

在 Ambari Metrics 系统中,数据分为两大类:

  1. 原始指标:最基础的点状数据,例如某台主机某时刻的 CPU 使用率。
  2. 聚合指标:对一段时间或某个范围内的指标数据进行统计后的结果,例如一分钟内的平均 CPU 使用率。

提示

聚合指标的重要性不止于数据缩减,它直接关系到 可视化展现效率 和 告警策略触发。 换句话说,如果没有合理的聚合,整个监控系统会陷入原始数据过载的泥沼。

image-20250919095502682

而 saveHostAggregateRecords 就是承载这个过程的“出口”。通过全局搜索可见,它被调用 7 次,这些调用点正是理解整个聚合触发链路的入口。

# 二、TimelineMetricHostAggregator:第一个落点

在调用链中,第一个出现的是 TimelineMetricHostAggregator。

image-20250919100522107

TimelineMetricHostAggregator extends AbstractTimelineAggregator
1

# 1、调用关系

  • saveHostAggregateRecords → 在 aggregate() 中被调用
  • aggregate() → 来自 AbstractTimelineAggregator.doWork()
  • doWork() → 由 runOnce() 调用
  • runOnce() → 最终落在 run()

# 2、设计思想

这种模式体现了典型的 模板方法模式:

  • 抽象类 (AbstractTimelineAggregator) 提供统一调度框架
  • 子类 (TimelineMetricHostAggregator) 实现具体逻辑

注意

如果你要自定义聚合逻辑,切记要遵守这个继承体系,否则无法被调度线程正确识别。

# 三、run 方法与多线程调度

关键代码如下:

@Override
public void run() {
  LOG.info("Started Timeline aggregator thread @ " + new Date());
  Long SLEEP_INTERVAL = getSleepIntervalMillis();
  runOnce(SLEEP_INTERVAL);
}
1
2
3
4
5
6

image-20250919101208297

这里有两个重要信号:

  1. Runnable 接口:run 方法表明它是一个 Runnable 任务,能被线程池调度。
  2. 定时触发:内部调用 runOnce,意味着周期性任务由外部调度器控制。

日志截图也佐证了这一点:

image-20250919101738912

小结

每一次日志打印背后,代表的是一次完整的 聚合执行周期。

# 四、聚合器家族谱系

我们先来看一下 AbstractTimelineAggregator 的子类全景:

image-20250919101937762

提示

从图中可以看到子类数量不少,看似涵盖了多种聚合维度。 但结合之前的探究,由于我们当前使用的都是 v2 表结构,真正能够投入使用的类其实有限。

我们再来看下图,我已经在其中做了标记:

image-20250919152621125

注意

  • 类清单 ≠ 实际运行;
  • v2 环境下只有少数几个类会被真正调度。

# 五、initializeSubsystem:一切的起点

我们回到初始化入口 initializeSubsystem。

image-20250919103016721

这里完成了以下步骤:

  1. 初始化 HBase 存储访问层 (PhoenixHBaseAccessor)
  2. 加载和校验 Metric Metadata
  3. 初始化聚合器工厂 TimelineMetricAggregatorFactory
  4. 使用 scheduleAggregatorThread 将各个聚合器纳入调度
初始化片段
TimelineMetricAggregator hourlyHostAggregator =
  TimelineMetricAggregatorFactory.createTimelineMetricAggregatorHourly(
    hBaseAccessor, metricsConf, metricMetadataManager, haController);
scheduleAggregatorThread(hourlyHostAggregator);
1
2
3
4

提示

注意配置项中存在聚合开关,例如 isHostInMemoryAggregationEnabled,在某些模式下会跳过 Host 聚合器。

# 六、scheduleAggregatorThread:核心逻辑

private void scheduleAggregatorThread(final TimelineMetricAggregator aggregator) {
  if (!aggregator.isDisabled()) {
    ScheduledExecutorService executorService =
      Executors.newSingleThreadScheduledExecutor(
        r -> new Thread(r, ACTUAL_AGGREGATOR_NAMES.get(aggregator.getName()))
      );
    executorService.scheduleAtFixedRate(
      aggregator,
      0L,
      aggregator.getSleepIntervalMillis(),
      TimeUnit.MILLISECONDS
    );
    LOG.info("Scheduled aggregator thread " + aggregator.getName() +
      " every " + aggregator.getSleepIntervalMillis() + " milliseconds.");
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 核心要点

  1. 单线程调度:每个聚合器独立线程,避免相互干扰
  2. 固定周期执行:scheduleAtFixedRate 保证调度稳定
  3. 可配置的间隔:间隔由 getSleepIntervalMillis() 决定
  4. 日志可观测性:清晰标明每个聚合器的执行频率

注意

若某个聚合器执行过慢,可能导致线程阻塞,影响后续调度周期。建议在性能调优时重点关注 minute 粒度的执行耗时。

# 七、调用链可视化

flowchart TD
    A[initializeSubsystem] --> B[Factory 创建 Aggregator]
    B --> C[scheduleAggregatorThread]
    C --> D[ScheduledExecutorService]
    D --> E[run()]
    E --> F[runOnce]
    F --> G[doWork]
    G --> H[aggregate]
    H --> I[saveHostAggregateRecords → HBase]
1
2
3
4
5
6
7
8
9

从反向出发,正向总结

最终落点是 HBase,调度逻辑则完全交由 JVM 线程池。

#Ambari-Metrics#源码解析#Ambari#Phoenix
[/metrics/aggregated] — 反向分析接口参数
[/metrics/aggregated] — 分时日表数据溯源

← [/metrics/aggregated] — 反向分析接口参数 [/metrics/aggregated] — 分时日表数据溯源→

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