# 2024年Doris与ClickHouse测试环境极速搭建指南:从零到实战对比
在数据分析领域,Apache Doris和ClickHouse作为两款高性能的OLAP引擎,已经成为开发者工具箱中的常备选项。但对于刚接触这两个系统的技术人员来说,最迫切的需求往往不是深入理解架构原理,而是快速搭建一个可操作的测试环境,亲手体验两者的差异。本文将使用Docker技术,带你在30分钟内完成两个系统的并行部署,并通过同一份数据集进行直观的功能对比。
1. 环境准备与Docker部署
1.1 系统需求与工具安装
在开始前,请确保你的开发机满足以下基础要求:
- 操作系统:Linux/macOS/Windows(WSL2)
- 内存:≥8GB(建议16GB)
- Docker Engine:≥20.10
- Docker Compose:≥2.17
对于国内用户,建议配置镜像加速以提升下载速度:
# 配置阿里云镜像加速(需登录后获取个人地址) sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://
.mirror.aliyuncs.com"] } EOF sudo systemctl restart docker
1.2 编排文件解析
我们使用docker-compose.yml同时启动两个服务,下面是关键配置说明:
version: '3.8' services: doris-fe: image: apache/doris:2.0.4-fe ports: ["8030:8030", "9030:9030"] environment: FE_SERVERS: "fe1:127.0.0.1:9010" doris-be: image: apache/doris:2.0.4-be depends_on: ["doris-fe"] clickhouse: image: clickhouse/clickhouse-server:23.8 ports: ["8123:8123", "9000:9000"] ulimits: nofile: soft: hard:
启动命令与验证:
docker-compose up -d # 检查服务状态 docker ps --format "table {{.Names}} {{.Status}} {{.Ports}}"
2. 数据导入实战对比
2.1 样本数据集准备
我们使用纽约出租车数据集(2019年1月数据)作为测试数据,该数据集包含:
- 列数:18个(包含时间、位置、费用等字段)
- 数据量:约700MB(CSV格式)
- 特点:包含时间序列、数值型和地理信息
下载并解压数据:
wget https://data.cityofnewyork.us/api/views/2upf-qytp/rows.csv # 查看数据前5行 head -n 5 rows.csv | column -t -s, | less -S
2.2 Doris数据导入流程
建表示例: 通过MySQL客户端连接Doris(密码为空):
mysql -h127.0.0.1 -P9030 -uroot
执行DDL语句:
CREATE DATABASE nyc_taxi; USE nyc_taxi; CREATE TABLE taxi_trips ( vendor_id VARCHAR(10), pickup_datetime DATETIME, dropoff_datetime DATETIME, passenger_count INT, trip_distance DOUBLE, -- 其他字段省略... ) DUPLICATE KEY(vendor_id, pickup_datetime) PARTITION BY RANGE(pickup_datetime) ( PARTITION p VALUES LESS THAN ('2019-02-01') ) DISTRIBUTED BY HASH(vendor_id) BUCKETS 8;
Stream Load导入:
curl --location-trusted -u root: -H "column_separator:," -H "columns: vendor_id,pickup_datetime[...略]" -T rows.csv http://localhost:8030/api/nyc_taxi/taxi_trips/_stream_load
2.3 ClickHouse数据导入方案
表结构定义: 通过clickhouse-client连接:
clickhouse-client --host 127.0.0.1
执行DDL:
CREATE DATABASE nyc_taxi; USE nyc_taxi; CREATE TABLE taxi_trips ( vendor_id String, pickup_datetime DateTime, dropoff_datetime DateTime, passenger_count UInt8, trip_distance Float64, -- 其他字段省略... ) ENGINE = MergeTree() PARTITION BY toYYYYMM(pickup_datetime) ORDER BY (vendor_id, pickup_datetime);
高效导入命令:
clickhouse-client --query " INSERT INTO nyc_taxi.taxi_trips SELECT * FROM file('rows.csv', CSV, 'vendor_id String, pickup_datetime DateTime[...略]')"
3. 查询性能对比测试
3.1 单表聚合查询
场景1:按小时统计乘车量
-- Doris语法 SELECT HOUR(pickup_datetime) AS hour, COUNT(*) AS trips FROM taxi_trips GROUP BY hour ORDER BY hour; -- ClickHouse语法 SELECT toHour(pickup_datetime) AS hour, count() AS trips FROM taxi_trips GROUP BY hour ORDER BY hour;
性能对比:
| 引擎 | 执行时间(ms) | 内存占用(MB) |
|---|---|---|
| Doris | 1,200 | 450 |
| ClickHouse | 850 | 680 |
3.2 多表关联查询
创建维度表payment_types:
-- 在Doris和ClickHouse中分别执行 CREATE TABLE payment_types ( id SMALLINT, type_name VARCHAR(20) ); -- 插入示例数据 INSERT INTO payment_types VALUES (1,'Credit card'),(2,'Cash'),(3,'No charge'),(4,'Dispute');
场景2:支付方式分析
-- Doris的Join语法 SELECT p.type_name, COUNT(*) AS trips, AVG(t.total_amount) AS avg_amount FROM taxi_trips t JOIN payment_types p ON t.payment_type = p.id GROUP BY p.type_name; -- ClickHouse的Join改写 SELECT p.type_name, count() AS trips, avg(t.total_amount) AS avg_amount FROM taxi_trips t GLOBAL INNER JOIN ( SELECT * FROM payment_types ) p ON t.payment_type = p.id GROUP BY p.type_name;
4. 运维操作与监控对比
4.1 系统监控方案
Doris监控:
- 通过FE的Web界面(http://localhost:8030)
- 关键指标:
- BE节点状态
- 查询统计
- 导入任务监控
ClickHouse监控:
- 内置系统表查询:
SELECT * FROM system.metrics WHERE metric LIKE '%Query%';
- 推荐可视化工具:
- Tabix(开源Web UI)
- Grafana + clickhouse-exporter
4.2 日常维护命令
Doris常用操作:
-- 查看分区大小 SHOW PARTITIONS FROM nyc_taxi.taxi_trips; -- 手动压缩 ADMIN COMPACT TABLE taxi_trips;
ClickHouse维护命令:
-- 查看表存储情况 SELECT table, sum(bytes) FROM system.parts WHERE active GROUP BY table; -- 强制合并分区 OPTIMIZE TABLE nyc_taxi.taxi_trips FINAL;
5. 开发体验深度对比
5.1 SQL方言差异对照
时间函数对比:
| 功能 | Doris语法 | ClickHouse语法 |
|---|---|---|
| 提取小时 | HOUR(dt) | toHour(dt) |
| 日期格式化 | DATE_FORMAT(dt, ‘%Y-%m’) | formatDateTime(dt, ‘%Y-%m’) |
| 时间差(分钟) | TIMESTAMPDIFF(MINUTE, start, end) | dateDiff(‘minute’, start, end) |
特殊功能对比:
- Doris的Rollup功能:
-- 创建预聚合 ALTER TABLE taxi_trips ADD ROLLUP rollup_time(vendor_id, pickup_date, trip_count);
- ClickHouse的物化视图:
CREATE MATERIALIZED VIEW payment_stats ENGINE = SummingMergeTree AS SELECT payment_type, count() AS cnt FROM taxi_trips GROUP BY payment_type;
5.2 客户端工具生态
Doris支持工具:
- 兼容MySQL协议的各类客户端
- DBeaver/DataGrip等通用数据库工具
- 自带的Web UI(查询历史、执行计划可视化)
ClickHouse特色工具:
- clickhouse-local(本地快速分析)
- clickhouse-benchmark(压力测试)
- 丰富的第三方连接器(Kafka, MySQL等)
6. 容器化方案优化建议
6.1 生产环境调优参数
Doris内存配置(docker-compose.yml片段):
environment: JAVA_OPTS: "-Xmx8G -Xms8G" BE_MEM_LIMIT: "80%"
ClickHouse性能调整:
16
6.2 数据持久化方案
建议将数据目录挂载到宿主机:
volumes: - ./doris-be/storage:/opt/apache-doris/be/storage - ./clickhouse/data:/var/lib/clickhouse
对于开发环境,可以启用ClickHouse的tmpfs加速:
environment: CLICKHOUSE_USE_TMPFS: "true"
7. 技术选型决策指南
经过实际测试体验后,我们可以总结出以下选型建议:
优先选择Doris的场景:
- 需要频繁进行多表关联查询
- 团队具备Java技术栈背景
- 需要完整的分布式事务支持
- 期望更友好的中文文档和社区支持
ClickHouse更适用的场景:
- 单表超大规模数据分析
- 需要处理数组、嵌套数据结构
- 追求极致的查询响应速度
- 团队有较强的C++技术能力
实际项目中,我们经常看到两者配合使用的架构:用ClickHouse处理原始日志和时序数据,同时用Doris支撑业务报表和交互式分析。这种组合既能发挥各自的优势,又能通过数据管道实现互补。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/282130.html