[/metrics/aggregated] — 聚合数据范围检查点
# 一、背景与结论(时间窗源头交代)
你将获得
- 聚合时间窗的取值来源;
- 优先级:ZK PropertyStore 优先,本地文件为回退;
- 定位方法:如何按聚合器名称在 ZK 中找到对应检查点节点。
入口代码非常直接,所有窗口计算都依赖它的返回值:
long lastCheckPointTime = readLastCheckpointSavingOnFirstRun(currentTime);
1
这句决定“从哪里开始聚”。下面按调用链 → 存储落点 → 回退策略来验证。
# 二、调用链路总览(从入口到落点)
# 1、入口到 CheckpointManager
AbstractTimelineAggregator.readLastCheckpointSavingOnFirstRun()
└─▶ AbstractTimelineAggregator.readCheckPoint()
└─▶ CheckpointManager.readCheckpoint(aggregatorName)
└─▶ CheckpointManager.getCheckpointZKPath(...)
1
2
3
4
2
3
4
关键点
- aggregatorName 唯一标识一个聚合器(分钟/小时/天、Host/Cluster 等), 因此每类聚合器在 ZK 中都有独立的检查点键,互不干扰。
# 三、聚合器命名与分区(避免串用检查点)
public enum AGGREGATOR_NAME {
METRIC_RECORD_MINUTE, METRIC_RECORD_HOURLY, METRIC_RECORD_DAILY,
METRIC_AGGREGATE_SECOND, METRIC_AGGREGATE_MINUTE,
METRIC_AGGREGATE_HOURLY, METRIC_AGGREGATE_DAILY,
}
static {
ACTUAL_AGGREGATOR_NAMES.put(METRIC_RECORD_MINUTE, "TimelineMetricHostAggregatorMinute");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_RECORD_HOURLY, "TimelineMetricHostAggregatorHourly");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_RECORD_DAILY, "TimelineMetricHostAggregatorDaily");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_AGGREGATE_SECOND, "TimelineClusterAggregatorSecond");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_AGGREGATE_MINUTE, "TimelineClusterAggregatorMinute");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_AGGREGATE_HOURLY, "TimelineClusterAggregatorHourly");
ACTUAL_AGGREGATOR_NAMES.put(METRIC_AGGREGATE_DAILY, "TimelineClusterAggregatorDaily");
PARTITION_AGGREGATION_TYPES.put(MetricCollectorHAController.METRIC_AGGREGATORS + "_0",
TimelineMetricAggregator.AGGREGATOR_TYPE.CLUSTER);
PARTITION_AGGREGATION_TYPES.put(MetricCollectorHAController.METRIC_AGGREGATORS + "_1",
TimelineMetricAggregator.AGGREGATOR_TYPE.HOST);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
逻辑名 | 实际名称 | 分区类型(示意) | 说明 |
---|---|---|---|
METRIC_AGGREGATE_MINUTE | TimelineClusterAggregatorMinute | CLUSTER(…_0 ) | 集群分钟聚合 |
METRIC_RECORD_MINUTE | TimelineMetricHostAggregatorMinute | HOST(…_1 ) | 主机分钟聚合 |
其他 | 同上 | 同上 | 小时/天粒度同理 |
结论
检查点键名 = 实际聚合器名称。从键名就能反推出窗口粒度与归属。
# 四、ZK PropertyStore 落点(优先来源)
聚合任务以 Helix Participant 身份加入集群,并在初始化阶段创建 CheckpointManager
:
manager = HelixManagerFactory.getZKHelixManager(clusterName, instanceName, PARTICIPANT, zkAddress);
manager.connect();
checkpointManager = new CheckpointManager(manager.getHelixPropertyStore());
1
2
3
2
3
getHelixPropertyStore()
依赖 PropertyPathConfig
拼装前缀路径:
addEntry(PropertyType.PROPERTYSTORE, 1, "/{clusterName}/PROPERTYSTORE");
1
实拍两张图帮助定位:
操作建议
- 进入 ZK:定位
/<ams-cluster>/PROPERTYSTORE/
; - 按实际聚合器名(如
TimelineClusterAggregatorMinute
)查找子节点; - 节点值通常是毫秒时间戳,用于下一轮窗口起点。
# 五、本地 checkpoint 回退(何时会用到)
在没有 Helix/HA 或降级场景下,会回退到本地文件读取:
protected long readCheckPoint() {
if (taskRunner != null) {
return taskRunner.getCheckpointManager().readCheckpoint(aggregatorName);
}
try {
File checkpoint = new File(getCheckpointLocation());
if (checkpoint.exists()) {
String contents = FileUtils.readFileToString(checkpoint);
if (contents != null && !contents.isEmpty()) {
return Long.parseLong(contents);
}
}
} catch (IOException io) {
LOG.debug("", io);
}
return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
该目录由 ams-site.xml
配置:
timeline.metrics.aggregator.checkpoint.dir
1
实际环境中的默认目录示例:
说明
如果你在 /var/lib/ambari-metrics-collector/checkpoint
没有看到文件,
通常意味着系统正优先使用 ZK PropertyStore 保存检查点,这是正常现象。
- 01
- [/metrics] — 反向分析接口参数 请求抓包09-17
- 02
- [/metrics] — 普通指标写入方法 POST09-17
- 03
- [/metrics] — 验证写入逻辑规则09-17