数据湖 vs 数据仓库:该不该上湖?怎么搭?

去年一个客户问我:“我们想把所有数据都存到S3,用Presto查,把数仓退了。数据湖不是更便宜吗?”
我问他:“你们现在数仓里有多少张表?”
“几百张。”
“有多少人用?”
“几十个分析师。”
“现在的查询响应时间呢?”
“大部分秒级,慢的几十秒。”
“换了Presto直接查S3,你觉得会更快还是更慢?”
他沉默了一会儿。
这是数据湖最常见的误解:以为数据湖是数仓的廉价替代品。其实不是替代,是补充。
今天聊聊数据湖与数据仓库。不是那种“数据湖很重要”的入门课,而是帮你理清楚:数仓和湖什么关系?该不该上湖?怎么搭才不变成数据沼泽?
01 数仓 vs 数据湖:两个物种
数据仓库:存储加工后的、结构化、已清洗的数据。存进去之前就知道怎么用。查询快,但贵。适合BI报表、固定分析。
数据湖:存储原始格式、结构化/半结构化/非结构化数据。存进去时不知道以后怎么用。存储便宜,但查询慢。适合数据探索、机器学习、日志分析。
简单说:数仓是精品超市,货架上都是处理好的商品,但租金贵。数据湖是批发仓库,什么原材料都有,便宜,但你要自己加工。
那家客户想用数据湖替代数仓,就是想把精品超市退了,直接去批发仓库买菜做饭。可行,但分析师得自己洗菜切菜,效率会降。
02 数据湖的三大坑
数据湖不是把数据丢进S3就完事。没治理,湖变沼泽。
坑一:没治理,查不动
一堆JSON、CSV、Parquet文件,没有元数据、没有分区、没有压缩。Presto查起来全表扫描,慢到怀疑人生。
解法:元数据管理。用Glue、Data Catalog、Hive Metastore管理表结构、分区、格式。
坑二:格式不统一
有的部门存Parquet,有的存CSV,有的存Avro。查询时得写不同的解析逻辑。
解法:统一存储格式。推荐Parquet(列存、压缩好)或ORC(带索引)。上游写入时转换。
坑三:ACID事务支持弱
Hive传统表不支持upsert、删除。数据湖里更新一条记录,要重写整个分区。
解法:用表格式。Iceberg、Delta Lake、Hudi支持ACID、时间旅行、Schema演进。
03 湖仓一体:两全其美
数据湖的存储成本低,数仓的查询性能好。湖仓一体兼得。
什么是湖仓一体:用数据湖存储,用数仓查询引擎查湖,或者用湖的查询引擎查数仓。
两种实现路径:
数仓查湖:Redshift Spectrum、BigLake、雪花外部表。数仓不存数据,只存元数据,查询时扫描湖上的文件。查询性能比直接查湖好,比纯数仓差一点。适合冷数据、不常查的数据。
湖上建仓:在湖上用表格式(Iceberg、Delta)组织数据,用Presto、Trino、Spark查询。性能和数仓接近,但存储成本低。适合热数据、对延迟不敏感的分析。
那家客户最后选了湖仓一体:热数据存数仓,冷数据归档到S3,用Spectrum查。数仓存储从10TB降到2TB,成本降了60%。分析师只用数仓查热数据,需要查历史数据时,自动走Spectrum。
04 怎么选:要不要上湖?
该上湖的场景:
有大量非结构化数据(日志、图片、视频)
数据量巨大(PB级),数仓存不起
数据探索性质强,还不知道怎么建模
机器学习训练需要原始数据
不该上湖的场景:
只有结构化数据,数仓完全够用
分析师只会SQL,不想学新工具
对查询性能要求高(秒级)
团队没有数据工程能力
那家客户有日志分析需求,每天几TB,数仓存不起,适合上湖。但他们的核心BI报表,还是留在数仓。
05 搭湖的技术选型
存储格式:首选Parquet。列存、压缩率高、支持嵌套结构。ORC也行,生态稍窄。
表格式:
Iceberg:时间旅行、Schema演进、隐式分区。适合需要历史回溯的场景。
Delta Lake:ACID、流批一体、Z-Order优化。适合Spark生态。
Hudi:增量处理、Upsert、记录级别的变更。适合CDC场景。
查询引擎:
Athena/Presto:SQL on湖,适合BI分析师
Spark:ETL、复杂计算,适合数据工程师
Trino:高性能分布式SQL,适合大规模查询
元数据管理:Glue、Data Catalog、Hive Metastore
06 一个真实案例:日志平台从数仓迁到湖
一个客户,日志数据每天5TB,存在数仓里,存储成本每月2万美元。查询主要是“过去7天错误日志统计”,性能要求不高(分钟级)。
改造方案:
日志写入S3,按日期分区,格式Parquet
元数据放Glue
用Athena查询
成本:S3存储每月3000美元,Athena按扫描量付费。总成本降到每月5000美元以内。查询性能:扫描一天的数据,10秒内返回。分析师接受。
数据负责人说:“以前日志存数仓,贵;现在存湖,便宜,查得也不慢。”
写在最后
数据湖和数据仓库不是二选一,是搭档。
那家客户的CTO后来总结:“数仓负责快,湖负责大。两者配合,才是现代数据平台的完整拼图。”
你的数据,适合进仓还是进湖?还是两个都要?