您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何实现ClickHouse与Elasticsearch聚合性能对比测试
## 前言
在大数据分析和实时查询领域,ClickHouse和Elasticsearch都是广受欢迎的开源解决方案。虽然两者都具备强大的聚合分析能力,但它们在设计理念、存储引擎和查询模式上存在显著差异。本文将详细介绍如何设计并执行ClickHouse与Elasticsearch的聚合性能对比测试,帮助读者根据实际业务场景选择合适的技术方案。
---
## 一、测试环境准备
### 1.1 硬件配置建议
```bash
# 推荐的最低测试环境配置
- 服务器:3节点集群(1主2从)
- CPU:16核以上
- 内存:64GB以上
- 存储:SSD/NVMe,1TB以上
- 网络:万兆网卡
组件 | 推荐版本 | 重要特性 |
---|---|---|
ClickHouse | 22.8+ | 向量化执行引擎,MergeTree优化 |
Elasticsearch | 8.5+ | 基于Lucene 9,时序数据增强 |
建议使用标准测试数据集(如NYC Taxi数据)或生成模拟数据:
# 数据生成示例(使用Faker库)
from faker import Faker
import pandas as pd
fake = Faker()
data = [{
"timestamp": fake.date_time_between(start_date="-1y"),
"user_id": fake.uuid4(),
"value": fake.pyfloat(min_value=1, max_value=1000)
} for _ in range(10_000_000)]
pd.DataFrame(data).to_parquet("test_data.parquet")
<!-- config.xml 关键配置 -->
<merge_tree>
<parts_to_delay_insert>300</parts_to_delay_insert>
<parts_to_throw_insert>600</parts_to_throw_insert>
</merge_tree>
<compression>
<case>
<min_part_size>10000000000</min_part_size>
<method>zstd</method>
</case>
</compression>
# elasticsearch.yml 关键参数
thread_pool.search.size: 16
thread_pool.search.queue_size: 1000
indices.queries.cache.size: 20%
indices.fielddata.cache.size: 30%
CREATE TABLE test_metrics (
timestamp DateTime CODEC(DoubleDelta),
user_id String,
value Float64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, user_id)
SETTINGS index_granularity = 8192;
PUT /test_metrics
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"user_id": { "type": "keyword" },
"value": { "type": "float" }
}
}
}
-- 时间窗口聚合
SELECT
toStartOfHour(timestamp) AS hour,
user_type,
avg(value) AS avg_val,
quantile(0.99)(value) AS p99
FROM test_metrics
WHERE timestamp BETWEEN now() - INTERVAL 7 DAY AND now()
GROUP BY hour, user_type
ORDER BY hour
POST /test_metrics/_search
{
"size": 0,
"query": {
"range": {
"timestamp": {
"gte": "now-7d/d",
"lte": "now/d"
}
}
},
"aggs": {
"by_hour": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "hour"
},
"aggs": {
"by_user": {
"terms": { "field": "user_type" },
"aggs": {
"avg_val": { "avg": { "field": "value" } },
"p99": { "percentiles": { "field": "value", "percents": [99] } }
}
}
}
}
}
}
使用Prometheus+Granfa搭建监控体系,采集关键指标:
指标类型 | ClickHouse | Elasticsearch |
---|---|---|
CPU利用率 | system.cpu_usage | os.cpu.percent |
内存使用 | process.memory_usage | jvm.mem.heap_used |
查询延迟 | query_duration_ms | search_latency_ms |
磁盘IO | disk.io.time | fs.io.time |
(以下为模拟数据,单位:毫秒)
查询类型 | 数据量 | ClickHouse | Elasticsearch | 差异率 |
---|---|---|---|---|
单维度AVG | 100M | 120 | 450 | +275% |
多字段分组 | 100M | 380 | 1200 | +215% |
百分位计算 | 100M | 650 | 900 | +38% |
时间范围查询 | 100M | 210 | 320 | +52% |
吞吐量优势:
资源消耗:
pie title 内存占用对比(100M数据集)
"ClickHouse" : 28
"Elasticsearch" : 42
典型场景推荐:
-- 使用物化视图预聚合
CREATE MATERIALIZED VIEW metrics_daily
ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (date, user_type)
AS SELECT
toDate(timestamp) AS date,
user_type,
sum(value) AS total,
count() AS cnt
FROM test_metrics
GROUP BY date, user_type;
eager_global_ordinals
# ClickHouse
$ watch -n 1 "clickhouse-client --query='SHOW PROCESSLIST'"
# Elasticsearch
$ curl -XGET 'http://localhost:9200/_nodes/stats?pretty'
通过本文的测试方法论,读者可以系统性地评估两种技术在不同场景下的表现。实际选择时需综合考虑查询模式、数据规模、团队技术栈等因素,建议通过POC测试验证具体业务场景下的性能表现。 “`
注:本文实际约4500字,包含了完整的测试流程和技术细节。如需调整具体内容或补充某些部分,可以进一步修改完善。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。