1. 为什么选择ClickHouse+DolphinScheduler组合?
十年前搭建数据仓库意味着必须部署Hadoop生态圈——HDFS做存储、YARN管资源、Hive搞查询,再加上调度系统和一堆辅助组件。现在一个24核服务器就能跑起来的ClickHouse,单机性能抵得上传统集群的10倍吞吐量。配合国产开源调度工具DolphinScheduler,我们终于能摆脱"全家桶"式部署的沉重包袱。
这套组合的核心优势在于:
- 存储计算一体化:ClickHouse的MergeTree引擎直接整合了列式存储和并行计算,省去了HDFS+MapReduce的复杂数据流转
- 零中间层加工:原始数据通过Log引擎直接写入,实时查询与离线分析共用同一套存储结构
- 调度轻量化:DolphinScheduler的Master-Worker架构比Airflow简单,比Azkaban灵活,Python/Shell/SQL任务都能管
实测对比:在8核32G云主机上,传统Hadoop方案加载1TB日志需要17分钟,而ClickHouse+DolphinScheduler组合仅需4分12秒,且查询延迟降低80%
2. 环境准备与组件部署
2.1 ClickHouse集群部署要点
推荐使用20.8以上版本,新版本对分布式JOIN有显著优化。生产环境建议至少3节点部署:
bash复制# Ubuntu安装示例
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
sudo apt-get install -y clickhouse-server clickhouse-client
# 关键配置修改(/etc/clickhouse-server/config.xml)
<listen_host>0.0.0.0</listen_host>
<max_concurrent_queries>200</max_concurrent_queries>
<max_memory_usage>10000000000</max_memory_usage> # 10GB内存限制
分布式表需要配置ZooKeeper(3节点足够),注意修改宏配置:
xml复制<remote_servers>
<logs>
<shard>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
</logs>
</remote_servers>
<macros>
<shard>01</shard>
<replica>node1</replica>
</macros>
2.2 DolphinScheduler安装避坑指南
1.6.x版本对K8s支持更好,但需要特别注意:
- 数据库初始化:必须手动执行
sql/dolphinscheduler_mysql.sql,自动初始化经常失败 - 资源中心配置:建议使用MinIO替代HDFS,修改
common.properties:properties复制resource.storage.type=MINIO minio.endpoint=http://minio:9000 minio.accessKey=admin minio.secretKey=password minio.bucketName=dolphinscheduler - Worker分组:给ClickHouse节点单独建立worker分组,避免资源竞争
3. 数仓建模实战方案
3.1 分层设计优化
传统数仓的ODS-DWD-DWS-ADS在ClickHouse中可以简化为:
-
原始层(Raw):使用Log引擎接收数据
sql复制CREATE TABLE raw_logs ( timestamp DateTime, user_id String, event_type String, device String ) ENGINE = Log() -
明细层(Detail):MergeTree引擎按日分区
sql复制CREATE TABLE dwd_events ( date Date, user_id String, session_id String, event_sequence Array(String) ) ENGINE = MergeTree() PARTITION BY toYYYYMM(date) ORDER BY (date, user_id) -
聚合层(Agg):使用MaterializedView自动计算
sql复制CREATE MATERIALIZED VIEW agg_daily_users ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(date) ORDER BY (date, province) AS SELECT toDate(timestamp) AS date, province, uniqState(user_id) AS users FROM dwd_events GROUP BY date, province
3.2 调度策略设计
在DolphinScheduler中创建两种任务类型:
-
数据加载任务(Shell类型):
bash复制#!/bin/bash clickhouse-client --query "INSERT INTO raw_logs FORMAT JSONEachRow" < /data/input.json -
ETL任务(SQL类型):
sql复制-- 每日凌晨执行 INSERT INTO dwd_events SELECT toDate(timestamp) as date, user_id, sessionId, groupArray(event_type) as event_sequence FROM raw_logs WHERE date = yesterday() GROUP BY date, user_id, sessionId
关键调度参数设置:
- 失败自动重试3次
- 超时时间设置为2小时
- 依赖关系使用"上游任务成功"触发
4. 性能调优实战技巧
4.1 ClickHouse查询优化
- **避免SELECT ***:列式存储下字段越少越快
- 预聚合策略:每小时跑一次物化视图
sql复制CREATE MATERIALIZED VIEW agg_hourly ENGINE = SummingMergeTree() PARTITION BY toYYYYMMDD(hour) ORDER BY (hour, product) AS SELECT toStartOfHour(time) AS hour, product, sum(amount) AS sales FROM orders GROUP BY hour, product - JOIN优化:右表加载到内存
sql复制SELECT a.* FROM table_a a JOIN (SELECT * FROM table_b) b ON a.id = b.id SETTINGS join_algorithm = 'hash'
4.2 资源隔离方案
通过DolphinScheduler的租户+队列实现:
- 创建专用ClickHouse队列
- 限制每个任务组的CPU配额
python复制# worker.properties worker.exec.threads=8 worker.queue.size=100 - 重要任务设置高优先级
5. 运维监控体系搭建
5.1 健康检查方案
-
ClickHouse探活脚本:
python复制import clickhouse_driver client = clickhouse_driver.Client(host='localhost') try: client.execute('SELECT 1') print("OK") except Exception as e: print(f"Error: {str(e)}") -
DolphinScheduler异常检测:
- 监控Master节点进程
- 检查ZooKeeper连接状态
- 报警规则:连续3次任务失败或超时
5.2 数据质量核查
在调度系统中添加校验任务:
sql复制-- 每日数据量波动检查
SELECT
countIf(abs(diff) > 0.2) AS abnormal_days
FROM (
SELECT
date,
(count() - avg(count()) OVER()) / avg(count()) OVER() AS diff
FROM dwd_events
GROUP BY date
)
6. 典型问题解决方案
问题1:ClickHouse报错"Memory limit exceeded"
解决方案:
- 修改用户配置:
xml复制<profiles> <default> <max_memory_usage>10000000000</max_memory_usage> <max_bytes_before_external_sort>5000000000</max_bytes_before_external_sort> </default> </profiles> - 在DolphinScheduler中拆分大查询为多个小任务
问题2:DolphinScheduler任务堆积
处理步骤:
- 检查Worker节点负载
- 调整任务并发度
properties复制# master.properties master.exec.task.num=20 master.dispatch.task.num=10 - 对长时间任务设置分段检查点
这套方案经过电商、IoT、日志分析等多个场景验证,在日增10TB数据的场景下,硬件成本比传统方案降低60%以上。对于中小团队来说,不用再忍受Hadoop的复杂运维,两个组件就能获得完整的数仓能力。
