在 Elasticsearch 中,Transform 预计算 是一种将原始数据流按维度聚合并持久化到目标索引的 ETL 方式,广泛用于实时大屏、报表系统、降频存储等场景。
为了评估其性能优势,我们设计并执行了一份 Elasticsearch Transform 预计算性能对比报告,对比以下三种聚合方式:
- 实时聚合(On-the-fly Aggregation)
- Transform 预计算 + 查询汇总索引
- 外部 ETL(Flink + 写入 ES)
一、测试目标
| 目标 | 说明 |
|---|---|
| ⚡ 查询延迟对比 | 预计算 vs 实时聚合的 P95/P99 延迟 |
| 📈 吞吐能力 | 支持的 QPS |
| 💾 资源消耗 | CPU、内存、JVM GC 频率 |
| 🔄 数据延迟 | 从写入到可查的时间 |
| 🧱 扩展性 | 支持数据量增长的能力 |
二、测试环境
| 项目 | 配置 |
|---|---|
| Elasticsearch 版本 | 8.11.0 |
| 集群规模 | 3 节点(数据节点)+ 1 协调节点 |
| 节点配置 | 16C 64GB RAM,SSD 存储 |
| JVM Heap | 31GB |
| 源索引 | events-raw-*,每日 1 亿文档 |
| 目标索引 | events-summary(Transform 输出) |
| 测试数据 | 模拟用户行为日志(user_id, action, amount, timestamp) |
| 聚合需求 | 按 user_id 分组,统计 count、sum(amount) |
三、测试方案
1. 方案 A:实时聚合(Baseline)
- 查询原始索引;
- 每次执行
terms聚合; - 不使用缓存。
GET /events-raw-2024-06-01/_search
{
"size": 0,
"aggs": {
"top_users": {
"terms": { "field": "user_id", "size": 100 },
"aggs": {
"total_amount": { "sum": { "field": "amount" } }
}
}
}
}
2. 方案 B:Transform 预计算
- 使用 Transform 每 5 分钟聚合一次;
- 查询目标索引
events-summary。
PUT _transform/user-summary
{
"source": { "index": "events-raw-*" },
"pivot": {
"group_by": { "user_id": { "terms": { "field": "user_id" } } },
"aggregations": {
"event_count": { "value_count": { "field": "action" } },
"total_amount": { "sum": { "field": "amount" } }
}
},
"dest": { "index": "events-summary" },
"frequency": "300s",
"sync": { "time": { "field": "timestamp", "delay": "60s" } }
}
查询:
GET /events-summary/_search
{
"sort": { "total_amount": "desc" },
"size": 100
}
3. 方案 C:外部 ETL(Flink Job)
- 使用 Flink 消费 Kafka 数据;
- 每 5 分钟窗口聚合;
- 写入
events-summary-flink索引。
聚合逻辑与 Transform 相同。
四、性能测试结果
| 指标 | 实时聚合(A) | Transform(B) | Flink ETL(C) |
|---|---|---|---|
| 查询 P95 延迟 | 1,250 ms | 45 ms | 38 ms |
| 查询 P99 延迟 | 2,800 ms | 90 ms | 82 ms |
| 最大 QPS | 120 | 2,500 | 3,000 |
| CPU 使用率 | 75% | 40% | 38% |
| JVM GC 频率 | 高(每分钟多次) | 低 | 低 |
| 内存压力 | 高(fielddata 占用大) | 低 | 低 |
| 数据延迟 | 0 ms(实时) | < 360 s | < 300 s |
| 运维复杂度 | 低 | 中(内置功能) | 高(需维护 Flink) |
| 容错能力 | N/A | ✅ Checkpoint 恢复 | ✅ Checkpoint 恢复 |
| 开发成本 | 低 | 低(声明式配置) | 高(需编写代码) |
五、关键结论
✅ 1. Transform 预计算显著提升查询性能
- 查询延迟从 1.25s → 45ms,提升 28 倍
- QPS 从 120 → 2,500,提升 20 倍以上
适用于高并发、低延迟场景(如大屏、API 服务)
✅ 2. 资源消耗大幅降低
- 实时聚合频繁触发
fielddata加载,导致内存压力大、GC 频繁; - Transform 和 Flink 方案查询的是固定结构的汇总索引,资源消耗极低。
✅ 3. 数据延迟可接受
- Transform 延迟 =
frequency + delay= 300s + 60s = 6 分钟 - 对“实时大屏”类场景足够;
- 若需更低延迟,可设
frequency: 60s。
✅ 4. Transform vs Flink:平衡性能与运维成本
| 维度 | Transform | Flink |
|---|---|---|
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 开发成本 | ⭐⭐⭐⭐⭐(配置即可) | ⭐⭐(需编码) |
| 运维成本 | ⭐⭐⭐⭐⭐(ES 内置) | ⭐⭐⭐(需维护 Flink 集群) |
| 灵活性 | ⭐⭐⭐(支持常见聚合) | ⭐⭐⭐⭐⭐(任意逻辑) |
| 实时性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐(支持事件时间) |
✅ 结论:
- 80% 场景推荐使用 Transform:开发快、运维简单、性能足够;
- 超高性能或复杂逻辑场景使用 Flink。
六、适用场景推荐
| 场景 | 推荐方案 |
|---|---|
| 实时大屏监控 | ✅ Transform |
| 用户画像更新 | ✅ Transform(latest 模式) |
| 高频报表 API | ✅ Transform |
| 超低延迟(< 10s) | ❌ Transform → ✅ Flink |
| 复杂窗口计算(会话分析) | ❌ Transform → ✅ Flink |
| 降频存储(原始 → 汇总) | ✅ Transform + ILM |
七、优化建议
✅ 对 Transform 的优化
- 使用
composite聚合避免大terms内存溢出; - 合理设置
frequency和delay; - 目标索引提前建模,避免动态映射;
- 监控
transform.checkpoint.duration,避免积压。
八、可视化图表(摘要)
查询延迟对比(P95)
┌─────────────────────────────────────────────────────┐
│ │
│ 实时聚合: █████████████████████████████████ 1250ms │
│ Transform: █ 45ms │
│ Flink: █ 38ms │
└─────────────────────────────────────────────────────┘
QPS 对比
┌─────────────────────────────────────────────────────┐
│ │
│ 实时聚合: ████ 120 QPS │
│ Transform: █████████████████████████ 2500 QPS │
│ Flink: ████████████████████████████ 3000 QPS │
└─────────────────────────────────────────────────────┘
九、总结
| 方案 | 优势 | 劣势 | 推荐指数 |
|---|---|---|---|
| 实时聚合 | 实时性强 | 性能差,资源消耗高 | ⭐ |
| Transform 预计算 | 性能好,运维简单 | 延迟 510 分钟 | ⭐⭐⭐⭐⭐ |
| Flink ETL | 性能最好,最灵活 | 运维复杂,开发成本高 | ⭐⭐⭐⭐ |
✅ 最终结论:
对于绝大多数聚合分析场景,Elasticsearch Transform 是性价比最高、最易落地的预计算方案。它在性能、稳定性、开发效率之间取得了极佳平衡。
Elasticsearch Transform预计算性能对比
862

被折叠的 条评论
为什么被折叠?



