2. AWS数据湖总体架构设计

数据湖不是"把所有数据倒进S3"这么简单。一个能长期演进、可治理、成本可控的企业级数据湖,必须在架构设计阶段就明确四件事:数据在哪一层、以什么格式存、按什么规则分区、由谁在什么边界内访问。本节以AWS Well-Architected框架的六大支柱(卓越运营、安全、可靠性、性能效率、成本优化、可持续性)为设计约束,给出一个可落地的四层数据湖总体架构。

四层分层架构与职责边界

分层的目的不是"多建几个桶",而是让每一层承担单一职责,使数据血缘清晰、重跑成本可控、权限可收敛。推荐的四层如下:

  • 原始层(Raw / Landing):数据的"不可变账本"。上游系统(RDS、Kafka、日志、第三方API)通过Kinesis Data Firehose、DMS、Glue或AWS DataSync写入,保持源系统原始格式(CSV、JSON、Parquet、二进制),不做业务清洗。保留期通常最长,用于审计回溯与重放。
  • 清洗层(Cleansed / Standardized):完成格式统一、类型转换、去重、空值处理、敏感字段脱敏。输出统一为列式格式,是数据质量校验(Glue Data Quality / DQDL)的主要落点。
  • Curated层(主题/汇总层):面向业务主题建模,按维度建模或宽表方式组织,完成跨源关联、指标口径统一、缓慢变化维处理。这一层是BI、报表、特征工程的主要数据来源。
  • 消费层(Consumption / Serving):面向具体消费场景做物理优化,例如为Athena/Redshift Spectrum准备的聚合表、为SageMaker准备的特征表、为QuickSight准备的高性能数据集,以及通过API Gateway/Lambda暴露的数据服务。

四层之间是单向依赖:Raw → Cleansed → Curated → Consumption。任何一层都不应反向读取下游数据,否则血缘会形成环,重跑将无法收敛。

上游数据源 RDS / Aurora Kafka / MSK 应用日志 第三方 API 本地文件 DMS / Firehose Glue Crawler / DataSync ① 原始层 Raw / Landing s3://dl-raw-{env}/source={sys}/dt={yyyy-MM-dd}/hour={HH}/ 格式:源格式原样(JSON / CSV / 二进制) · 不可变 · 保留 365 天 写入:Firehose / DMS / Glue Job · 加密:SSE-KMS · 版本控制:开启 ② 清洗层 Cleansed / Standardized s3://dl-cleansed-{env}/domain={domain}/dt={yyyy-MM-dd}/ 格式:Parquet + Snappy · 类型统一 · 去重 · 脱敏 · DQDL 校验 引擎:Glue ETL / Spark · 分区:dt 日分区 · 保留 180 天 ③ Curated 层(主题 / 汇总) s3://dl-curated-{env}/subject={subject}/dt={yyyy-MM-dd}/ 维度建模 / 宽表 · 指标口径统一 · SCD2 · 跨源关联 格式:Parquet + ZSTD · 分区:dt + 业务维度 · 保留 730 天 ④ 消费层 Consumption / Serving s3://dl-serving-{env}/app={app}/dt={yyyy-MM-dd}/ Athena 聚合表 · Redshift Spectrum 外部表 · SageMaker 特征表 QuickSight 数据集 · API 数据服务 · 按场景 TTL 清理 统一元数据:Glue Data Catalog · 权限:Lake Formation + IAM · 审计:CloudTrail + S3 Access Logs

存储格式与分区策略

格式选择直接影响查询成本与性能。原始层保留源格式是为了"可重放",但从清洗层开始应统一为列式格式。推荐组合:清洗层与Curated层使用 Parquet + Snappy(兼容性好、压缩率适中),消费层对扫描量敏感的表可改用 Parquet + ZSTD(压缩率更高,Athena扫描字节数更少)。小文件是数据湖性能的头号杀手,建议在写入端控制单文件128~512MB,并通过Glue的groupFiles或定期OPTIMIZE(Iceberg)合并。

分区策略遵循"高基数、常过滤、低膨胀"三原则。以订单主题为例:

s3://dl-curated-prod/subject=orders/dt=2024-06-15/region=cn-north-1/part-00000.parquet

这里用 dt 做日分区、region 做二级分区。注意不要用user_id这类高基数字段做分区,否则会产生海量小分区,反而拖慢Glue Catalog的元数据操作。若单日数据量小于1GB,可只保留dt一级分区,用文件内排序+Parquet谓词下推替代二级分区。

元数据管理与安全边界

元数据统一收敛到 Glue Data Catalog:每个层的每个主题对应一个Database,表结构由Crawler或Glue ETL自动注册。关键实践是给每张表打上业务标签(如data_domain、owner、sensitivity),这些标签是Lake Formation做列级/行级权限控制的依据。

安全边界按"层"划分,而不是按"人"划分。推荐的最小权限模型:

  • Raw层:仅采集角色可写,分析师默认无读权限;
  • Cleansed层:ETL角色可读写,数据工程师可读;
  • Curated层:数据建模角色可写,分析师按域授权读;
  • 消费层:按应用授权,通过Lake Formation的Table与Column级Grant控制。

跨账户共享时,使用Lake Formation的资源链接(Resource Link)而非直接改S3桶策略,这样权限变更可审计、可回收。所有层默认开启SSE-KMS加密,密钥按环境隔离(dev/test/prod各一把CMK)。

成本模型与生命周期

数据湖成本主要由三部分构成:S3存储、请求次数、计算(Glue/Athena/Redshift)。以某电商示例(非实测,仅用于说明量级)估算:原始层每日新增200GB,保留365天,标准存储约73TB;若全部使用S3 Standard,按0.023 USD/GB-月计算,月存储成本约1680 USD。通过生命周期策略可显著降低:

层0–30天31–90天91–365天365天以上
RawS3 StandardStandard-IAGlacier Instant RetrievalGlacier Deep Archive
CleansedS3 StandardStandard-IAGlacier Instant Retrieval删除或归档
CuratedS3 StandardS3 StandardStandard-IA按合规保留
消费层S3 Standard按TTL删除——

按上表策略,Raw层约60%的数据在90天后转入低频/归档,月存储成本可降至约900 USD量级。同时应开启S3 Storage Lens与Cost Allocation Tags(按layer、domain打标),把成本归集到具体数据域,避免"数据湖账单无人认领"。

设计检查点:每一层是否都有明确的Owner、保留期、加密密钥和访问角色?如果某一层说不清"谁写、谁读、留多久",说明分层边界还没有真正定义清楚。