2026年保姆级教程:手把手教你用Docker快速搭建Doris和ClickHouse测试环境(2024最新版)

保姆级教程:手把手教你用Docker快速搭建Doris和ClickHouse测试环境(2024最新版)2024 年 Doris 与 ClickHouse 测试环境极速搭建指南 从零到实战对比 在数据分析领域 Apache Doris 和 ClickHouse 作为两款高性能的 OLAP 引擎 已经成为开发者工具箱中的常备选项 但对于刚接触这两个系统的技术人员来说 最迫切的需求往往不是深入理解架构原理 而是快速搭建一个可操作的测试环境 亲手体验两者的差异 本文将使用 Docker 技术

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。

# 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支撑业务报表和交互式分析。这种组合既能发挥各自的优势,又能通过数据管道实现互补。

小讯
上一篇 2026-04-30 12:04
下一篇 2026-04-30 12:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/282130.html