融合架构设计原则:读写分离、元数据统一管理、计算与存储分离、开放格式
说实话,做数据架构这些年,我见过太多「湖不像湖、仓不像仓」的尴尬局面。有的团队把数据湖搞成了数据沼泽,有的把数据集市做成了数据孤岛。问题出在哪?说白了,就是没想清楚架构设计的原则。
这一章,我把自己踩过的坑、总结的经验,浓缩成四个核心原则。你把这四个原则吃透了,融合架构的骨架就有了。
原则一:读写分离——别让查询拖垮写入
先讲个真实案例。我之前帮一家电商公司做架构改造,他们的实时报表系统一到促销季就挂。排查下来发现,数据写入链路和查询链路共用同一套资源。写入任务一多,查询就超时;查询一多,写入就积压。
读写分离,说白了就是让「写」和「读」走不同的通道。写入走批处理管道,查询走独立的查询引擎。互不干扰。
- 写入通道:数据通过 Flink、Spark Streaming 写入数据湖的原始层(Bronze),保证高吞吐。
- 查询通道:数据集市层(Gold)的数据通过 Presto、Trino 或 ClickHouse 对外提供服务,保证低延迟。
- 中间层:Silver 层做清洗和聚合,写入和查询都走内部调度,不暴露给外部。
你可能会问:那数据一致性怎么保证?嗯,这里有个技巧——我习惯用「快照隔离」机制。每次写入生成一个新的快照版本,查询只读已提交的快照。这样读写之间完全解耦。
原则二:元数据统一管理——别让数据变成「黑盒」
我记得有一次,一个数据科学家跑过来问我:「咱们那个用户行为表,到底哪个字段是 event_time?」我翻了三个文档,问了两个人,才找到答案。这种痛苦,你经历过吗?
元数据统一管理,就是给所有数据资产建一个「户口本」。不管数据在湖里还是在集市里,元数据都归到一个地方管。
| 元数据类型 | 管理内容 | 常用工具 |
|---|---|---|
| 技术元数据 | 表结构、字段类型、分区信息、文件路径 | Hive Metastore、AWS Glue Catalog |
| 业务元数据 | 字段含义、数据来源、业务口径、负责人 | Apache Atlas、DataHub、Amundsen |
| 操作元数据 | 数据血缘、调度依赖、运行日志、质量监控 | Marquez、OpenLineage |
我建议的做法是:用 Hive Metastore 作为底层存储,上面挂 Atlas 做血缘和治理。所有写入和查询都通过 Metastore 获取元数据,避免「各管各的」。
原则三:计算与存储分离——弹性伸缩的关键
这个原则,说白了就是「算归算、存归存」。计算资源可以随时扩缩容,存储资源按需付费。你想想看,如果计算和存储绑在一起,大促时想加计算节点,还得连带加存储,多浪费。
在数据湖与数据集市融合的场景下,我推荐这样的架构:
- 存储层:统一放在对象存储(S3、OSS、HDFS)上,数据格式用 Parquet 或 ORC。
- 计算层:Spark 做批处理,Flink 做流处理,Presto/Trino 做交互式查询。计算集群可以按需启动和销毁。
- 弹性策略:白天跑查询,晚上跑 ETL。资源不够时自动扩容,空闲时缩容到最小。
原则四:开放格式(Parquet/ORC)——别被厂商锁定
我见过不少团队,一开始用某个厂商的专有格式,后来想迁移到开源平台,发现数据读不出来。那叫一个痛苦。
开放格式的好处很明显:
- Parquet:列式存储,压缩率高,适合分析型查询。我一般用在数据湖的 Silver 和 Gold 层。
- ORC:也是列式存储,但针对 Hive 做了优化,支持更高效的 ACID 事务。适合需要频繁更新的场景。
怎么选?我个人的习惯是:
- 如果主要用 Spark 和 Presto,选 Parquet。生态更广,兼容性更好。
- 如果主要用 Hive 和 ACID 事务,选 ORC。性能更优。
- 如果两者都用,可以混搭。但元数据要统一管理,别搞混。
四个原则的关系图
下面这张图,是我自己画的一个架构概览。你可以看到四个原则如何协同工作:
总结一下
这四个原则,不是孤立存在的。读写分离保证性能,元数据统一管理保证可治理,计算存储分离保证弹性,开放格式保证可迁移。它们共同构成了融合架构的「四梁八柱」。
我建议你在做架构设计时,先把这四个原则写下来,贴在墙上。每次做技术选型,都问自己一句:这个选择,符合这四个原则吗?