2、数据湖架构设计原则:分层架构思想(Bronze/Silver/Gold)、存储与计算分离原则、开放格式与厂商锁定规避、元数据驱动设计
好,咱们直接进入正题。数据湖架构设计,说白了就是一套「怎么把数据管好、用好」的方法论。我见过太多团队,一上来就搞技术选型,结果数据湖变成了「数据沼泽」。今天聊的这几个原则,是我在多个企业级项目中反复验证过的。你想想看,没有规矩不成方圆,架构设计也一样。
2.1 分层架构思想:Bronze / Silver / Gold
这个分层模型,现在几乎是数据湖的事实标准。我最早接触是在 Databricks 的 Delta Lake 体系里,后来发现它确实好用。
Bronze 层(原始数据层)
这一层存的是「原汁原味」的数据。从业务系统、日志、IoT 设备等源头直接拉过来,不做任何清洗。格式保持原样,JSON、CSV、Avro 都行。为什么?因为一旦做了转换,原始信息就丢了。我在项目中遇到过,业务方突然要查半年前的某个字段,幸好 Bronze 层保留了原始记录,否则根本没法回溯。
Silver 层(清洗与标准化层)
到了这一层,数据开始「像样」了。去重、类型转换、字段标准化、简单的质量校验。说白了,就是把脏数据洗干净。Silver 层的数据通常用于日常的报表和轻度分析。嗯,这里要注意:不要在这一层做太复杂的业务逻辑,否则后面改起来很痛苦。
Gold 层(业务聚合层)
这一层是给业务用户直接用的。数据经过聚合、宽表化、指标预计算。比如销售日报、用户画像标签。我建议 Gold 层的数据尽量用列式存储(Parquet),查询性能好很多。
2.2 存储与计算分离原则
这个原则,我愿称之为「数据湖的基石」。传统 Hadoop 时代,存储和计算绑在一起,扩容要一起扩,浪费资源不说,还容易出故障。
存储与计算分离,说白了就是:数据放在一个地方,计算引擎在另一个地方跑。比如数据存在 S3 或 OSS 上,Spark、Presto、Flink 各自去读。好处很明显:
- 弹性伸缩:计算资源可以按需启停,存储成本相对固定
- 引擎解耦:今天用 Spark,明天换 Trino,数据不用动
- 成本优化:冷数据放低频存储,热数据放高频存储
我曾经帮一家金融客户做架构改造,他们之前用的是 HDFS + MapReduce,每次扩容都要等两周。改成存算分离后,计算集群可以在 10 分钟内扩缩容。你想想看,这效率差距有多大?
2.3 开放格式与厂商锁定规避
这一点,我吃过亏。早期做数据湖时,用了某个厂商的专有格式,后来想迁移,发现数据导不出来,或者导出后格式不兼容。那叫一个难受。
所以我现在坚持:数据格式必须开放。推荐使用 Parquet、ORC、Avro 这些开源列式存储格式。它们有社区支持,主流引擎都支持读写。
另外,表格式也很重要。Delta Lake、Apache Iceberg、Apache Hudi 都是不错的选择。它们提供了 ACID 事务、时间旅行、Schema 演化等能力。我个人的习惯是:优先选 Iceberg,因为它对 Spark、Flink、Trino 的支持最全面,而且社区活跃。
| 特性 | Delta Lake | Apache Iceberg | Apache Hudi |
|---|---|---|---|
| 开放程度 | 中等(Databricks 主导) | 高(Apache 基金会) | 高(Apache 基金会) |
| ACID 支持 | 是 | 是 | 是 |
| 时间旅行 | 是 | 是 | 是 |
| 引擎兼容性 | Spark 为主 | Spark、Flink、Trino | Spark、Flink |
2.4 元数据驱动设计
数据湖里数据多了,最怕什么?怕找不到数据,怕不知道数据是什么含义。元数据管理就是解决这个问题的。
元数据驱动,说白了就是:让数据自己描述自己。包括技术元数据(字段类型、分区信息)、业务元数据(字段含义、数据来源)、操作元数据(数据血缘、更新时间)。
我建议搭建一个统一的元数据平台,比如 Apache Atlas 或 Amundsen。它能帮你做到:
- 自动发现:新数据入湖后,自动注册到元数据平台
- 数据血缘:从 Bronze 到 Gold,数据怎么流转的,一目了然
- 数据质量:每个字段的完整性、准确性,都能监控
举个例子。我在项目中遇到过,业务方问「这个销售额字段是怎么算的?」。如果没有元数据,你得去翻代码、问开发。有了元数据平台,直接查字段的血缘图,从原始日志到聚合指标,每一步都清清楚楚。
好了,这一章的内容就这些。分层架构让你知道数据怎么放,存算分离让你知道资源怎么配,开放格式让你不被绑定,元数据驱动让你知道数据是什么。这四个原则,是数据湖架构的「四梁八柱」。下一章,我们聊聊具体的技术选型。