Data Lake
数据湖会将任意格式的原始数据存储在低成本对象存储中,并在读取时应用架构。了解数据湖与数据仓库和湖仓的区别。
数据湖是一个集中式存储库,以数据的原始本机格式保存数据,涵盖数据库导出文件、JSON 日志,以及图像、视频、音频和文档;数据通常存储在低成本的云对象存储中,并且只有在读取数据时才应用结构。Pentaho 当时的首席技术官 James Dixon 于 2010 年创造了这个术语,用来对比数据集市——他把数据集市比作经过净化和包装的瓶装水——以及处于自然状态、可供许多用户取用的大量数据。由于无需预先建模,数据湖可以保留组织收集的所有数据,这很适合机器学习:明天模型所需的训练数据,往往是存储时还没人知道用途的原始数据。
数据湖的工作原理#
数据湖将存储与计算分离。文件存放在 Amazon S3、Google Cloud Storage 或 Azure Data Lake Storage 等对象存储中,Spark、Trino 或 Python 进程等引擎可直接读取这些文件,因此每个团队都能独立扩展自己的计算资源,而无需复制数据。表格数据通常以 Apache Parquet 等开放列式格式存储,而图像和视频仍以普通文件形式保存,通常旁边还会有 JSON 或 Parquet 清单文件,其中包含它们的元数据和标签。
大多数数据湖会按数据精炼程度划分区域,这种组织方式被 Databricks 称为奖章架构:原始(青铜)区域会原样保留数据,清洗(白银)区域存放经过验证和去重的数据,精选(黄金)区域则存放可用于报告或训练的表和数据集。AWS Glue Data Catalog、Hive Metastore 或 Unity Catalog 等元数据目录会记录每个数据集包含的内容、所有者以及有权读取它的人。如果数据湖没有目录和数据清洗,就会退化成“数据沼泽”:文件无人能找到、无法信任,也无法安全删除。
读取时应用架构#
数据湖会在读取数据时应用架构,这称为读取时应用架构。写入方可以在数据生成后立即写入,即使两个来源的字段不一致也没关系;读取方则可以自行决定所需的列和类型。以下示例写入两个字段不同的原始 JSON 文件,然后使用 Polars 按同一个架构读取它们:
import json
from pathlib import Path
import polars as pl
# 原始区域:两台摄像头以 JSON 行格式写入检测事件,每台摄像头使用各自的字段
Path("lake/raw").mkdir(parents=True, exist_ok=True)
Path("lake/raw/dock-1.jsonl").write_text(json.dumps({"label": "forklift", "conf": 0.91}))
Path("lake/raw/dock-2.jsonl").write_text(json.dumps({"label": "person", "conf": 0.62, "lux": 120}))
# 读取时应用架构:读取方在查询文件时选择列和类型
schema = {"label": pl.String, "conf": pl.Float32, "lux": pl.Int32}
events = pl.scan_ndjson("lake/raw/*.jsonl", schema=schema, include_file_paths="source")
print(events.collect())结果包含两行,以及 label、conf、lux 和 source 这几列。第一台摄像头从未记录 lux,因此该列的值会返回为 null;source 则记录每一行来自哪个原始文件。另一个作业可以使用不同的架构读取相同的文件,而无需重写这些文件。
数据湖、数据仓库与湖仓的比较#
- 数据仓库:以固定架构存储经过清洗的结构化表格,数据加载时必须符合该架构(写入时应用架构),通常还要经过提取、转换、加载(ETL)步骤。Snowflake、BigQuery 和 Redshift 等数据仓库可以快速处理 SQL 和商业智能查询,但对图像、文本及其他非结构化数据的支持不够灵活。
- 数据湖:以低成本存储任意格式的数据,并在加载后转换数据(ELT),适合探索、数据挖掘和机器学习。普通数据湖文件不支持事务,因此并发写入方可能会让读取方读到只写入了一部分的结果。
- 湖仓:通过 Apache Iceberg、Delta Lake 和 Apache Hudi 等开放表格式,为数据湖存储增加数据仓库功能,支持 ACID 事务、架构强制执行和回溯到表的早期版本。Databricks 的研究人员在 2021 年的一篇论文中介绍了这种架构。
机器学习中的数据湖#
对于计算机视觉团队,数据湖会保存每一帧摄像头画面、采集元数据、标注,以及已部署模型对这些画面所做的预测。自动驾驶汽车项目会上传车队的行驶日志,并从中挖掘罕见场景,例如雨夜中的行人,然后对这些场景进行标注并加入训练集。在医疗保健领域,集中存储在一个数据湖中的去标识化扫描图像和报告,可为医学图像分析模型提供数据。将生产环境中的预测结果送回数据湖以供审查和重新标注,可以形成数据飞轮;表快照或 DVC 等工具则能固定每个模型训练所用的确切数据版本。特征库和向量数据库通常构建在数据湖之上,用于提供从原始文件中提取的特征或嵌入。
Ultralytics Platform 可以将 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 中的文件夹直接转换为训练数据集,无需上传副本:每次导入时,它都会就地索引最多 500,000 个对象,使用只读凭据,解析图像旁边的 YOLO .txt 标签文件,并根据文件夹名称分配训练集、验证集和测试集。每张索引图像都会固定到其对象版本,因此如果数据湖中的图像文件被覆盖,Platform 会安全地拒绝处理该图像。










