TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件专题

    • 安装教程
    • 魔改分享
  • 版本专题

    • 更新说明
    • BUG临时处理
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • APT仓库增量更新
    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Ambari-Metrics
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • Grafana监控方案

    • Ambari-Metrics插件
    • Infinity插件
  • 支持&共建

    • 蓝图愿景
    • 合作共建
登陆
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件专题

    • 安装教程
    • 魔改分享
  • 版本专题

    • 更新说明
    • BUG临时处理
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • APT仓库增量更新
    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Ambari-Metrics
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • Grafana监控方案

    • Ambari-Metrics插件
    • Infinity插件
  • 支持&共建

    • 蓝图愿景
    • 合作共建
登陆
GitHub (opens new window)
  • 试读&介绍

  • Ambari-Metrics解读【简写AMS】

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

    • AMS-Collector表结构实战

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

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

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

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

      • [/metrics/aggregated] — 反向分析接口参数
      • [/metrics/aggregated] — 聚合指标触发逻辑溯源
      • [/metrics/aggregated] — 分时日表数据溯源
        • 一、doWork:聚合主线与时间窗
        • 二、重要代码解读
          • 1、prepareMetricQueryCondition 干什么的
          • 2、prepareGetMetricsSqlStmt 干什么的
          • 3、aggregate 干什么的
        • 三、v2 与 v1 的差异(边看图边对照)
        • 四、选型与开关:谁让 v2 生效?
        • 五、执行链路串讲:从“拼 SQL”到“写回库”
        • 六、思考
      • [/metrics/aggregated] — 聚合数据范围
  • GOD-Ambari-Metrics
  • Ambari-Metrics解读【简写AMS】
  • AMS-Collector-聚合指标写入-接口实战
JaneTTR
2025-09-17
目录

[/metrics/aggregated] — 分时日表数据溯源

# 一、doWork:聚合主线与时间窗

image-20250922122029029

读图要点

1、入口是 doWork(startTime, endTime);

2、左闭右开窗口 [startTime, endTime) 来自“检查点对齐”;

3、三段职责:prepareMetricQueryCondition → prepareGetMetricsSqlStmt → 执行并提交。

接着把“这个窗口真的被使用了吗?”用日志落点验证:

image-20250922122425377

2025-09-19 10:34:43,248 INFO TimelineClusterAggregatorMinute: Start aggregation cycle ...
2025-09-19 10:34:44,602 INFO TimelineMetricHostAggregatorMinute: 4259 row(s) updated in aggregation.
1
2

观测口径

  • Start aggregation cycle:本轮窗口;
  • row(s) updated):Phoenix 端生效行数,是聚合是否成功的直接量化指标。

# 二、重要代码解读

# 1、prepareMetricQueryCondition 干什么的

image-20250922122907084

上图对应的 v2 片段将“计算+写库”内联进一条 SQL:

public static final String GET_AGGREGATED_APP_METRIC_GROUPBY_SQL = "UPSERT " +
 "INTO %s (UUID, SERVER_TIME, METRIC_SUM, METRIC_COUNT, METRIC_MAX, METRIC_MIN) SELECT UUID, %s AS SERVER_TIME, " +
 "ROUND(AVG(METRIC_SUM),2), ROUND(AVG(%s)), MAX(METRIC_MAX), MIN(METRIC_MIN) FROM %s WHERE%s SERVER_TIME >= %s AND " +
 "SERVER_TIME < %s GROUP BY UUID";
1
2
3
4

关键点

  • SERVER_TIME 取 endTime - 1000,确保落库点对齐窗口右界;
  • GROUP BY UUID 保持维度一致性,避免重复或漏聚。

# 2、prepareGetMetricsSqlStmt 干什么的

  • 当 condition.getStatement() != null(v2 常态)时,直接采用上一步内联语句,只补 WHERE/ORDER/LIMIT;
  • 当为 v1 路径时,先按精度选择 METRICS_AGGREGATE_MINUTE/HOUR/DAILY[_UUID] 再拼 WHERE。
if (condition.getStatement() != null) {
  stmtStr = condition.getStatement(); // v2:直接用 UPSERT…SELECT
} else {
  // v1:按精度选表 + GET_METRIC_AGGREGATE_ONLY_SQL
}
1
2
3
4
5

# 3、aggregate 干什么的

v2 多为记录窗口与目标表的日志;v1 则在这里触发 saveCluster/HostAggregateRecords*,把 ResultSet 分批 UPSERT。

image-20250922133640256

int rows = stmt.executeUpdate();
conn.commit();
LOG.info(rows + " row(s) updated in aggregation.");
1
2
3
v1 的查询模板
public static final String GET_METRIC_AGGREGATE_ONLY_SQL =
 "SELECT UUID, SERVER_TIME, METRIC_SUM, METRIC_MAX, METRIC_MIN, METRIC_COUNT FROM %s";
1
2

v1 将“查数据”和“写数据”物理解耦,便于 Java 侧进行分批封装与节奏控制。

# 三、v2 与 v1 的差异(边看图边对照)

image-20250922133917242

速查表

维度 v2:GroupBy 一步式 v1:SELECT → saveXXX 分步
SQL 形态 UPSERT … SELECT … GROUP BY 先 SELECT 后批量 UPSERT
Java 侧职责 轻(以日志/校验为主) 重(封装行、批量提交)
可观测性 看 row(s) updated) 还可看分批大小和写入节奏
调优侧重 Phoenix 计划/索引/统计 批量阈值、提交频率

继续对比 v2 的两类聚合器(主机/集群):

image-20250922131609145

两者在 v2 中 aggregate 只做窗口记录;实际写入在 SQL 内联阶段完成。

# 四、选型与开关:谁让 v2 生效?

image-20250922165023521

image-20250922165224825

timeline.metrics.service.use.groupBy.aggregators

  • true:实例化 v2 家族(Minute/Hour/Day × Host/Cluster),走 UPSERT…SELECT 主路径;
  • false:回落 v1,两段式更易在 Java 侧做精细化控制。

image-20250922170920695

上线建议

  • 默认生产:开启 v2,减少调用栈复杂度;
  • 排障回归:可短暂关闭改走 v1,观测批次/提交节奏定位非 Phoenix 侧瓶颈。

# 五、执行链路串讲:从“拼 SQL”到“写回库”

image-20250922162948899

1、读取检查点并对齐窗口; 2、prepareMetricQueryCondition:v2 生成内联 UPSERT…SELECT;v1 只生成 SELECT; 3、prepareGetMetricsSqlStmt:补 WHERE/ORDER/LIMIT; 4、执行与提交:

  • v2:一条语句完成聚合与写入;
  • v1:aggregate(rs) 内 saveXXX 分批 UPSERT。

目标表定位

MINUTE → METRIC_RECORD_MINUTE_UUID

HOUR → METRIC_AGGREGATE_HOURLY[_UUID]

DAY → METRICS_AGGREGATE_DAILY[_UUID]

# 六、思考

在上文我们看到 doWork(startTime, endTime) 是聚合的真正入口。那问题来了:startTime / endTime 怎么决定?

看源码(如下图红框部分):

image-20250922175029987

  1. 读取当前时间

    long currentTime = System.currentTimeMillis();
    
    1

    Collector 先拿系统时间作为参考基准。

  2. 读取上次检查点

    long lastCheckPointTime = readLastCheckpointSavingOnFirstRun(currentTime);
    
    1
  • 如果是第一次运行,就用 currentTime 做初始化(防止起点缺失);
  • 否则从存储中读取上次的 checkpoint。
  1. 决定窗口

    doWork(lastCheckPointTime, lastCheckPointTime + SLEEP_INTERVAL);
    
    1
  • startTime = 上次 checkpoint;
  • endTime = checkpoint + 固定的 SLEEP_INTERVAL;
  • 这样每次 doWork 就覆盖一个完整的窗口。
  1. 更新检查点

    saveCheckPoint(lastCheckPointTime + SLEEP_INTERVAL);
    
    1

    聚合成功后,checkpoint 前移,等待下一轮调度。

注意

我们将在下一章,讲解检查点的原理

#Ambari#Ambari-Metrics#TimelineService#Aggregated#Phoenix#AbstractTimelineAggregator#GroupByAggregator#HBaseTimelineMetricsService
[/metrics/aggregated] — 聚合指标触发逻辑溯源
[/metrics/aggregated] — 聚合数据范围

← [/metrics/aggregated] — 聚合指标触发逻辑溯源 [/metrics/aggregated] — 聚合数据范围→

最近更新
01
[/metrics/aggregated] — 聚合数据范围 检查点
09-19
02
[/metrics] — 反向分析接口参数 请求抓包
09-17
03
[/metrics] — 普通指标写入方法 POST
09-17
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式