一、数据入湖概述:什么是数据湖、Lakehouse架构演进、入湖场景与挑战
1.1 数据湖到底是什么?
先聊聊数据湖。这个概念最早是2010年左右提出的,说白了就是一个「存所有东西的大池子」。你想想看,传统数仓只能存结构化数据,但日志、图片、音视频这些半结构化和非结构化数据怎么办?数据湖就是来解决这个问题的。
我个人习惯把数据湖比作一个「数据超市」——你把原始数据原封不动地扔进去,不用提前设计表结构,想用的时候再拿出来加工。它的核心特征就三个:
- 存原始格式:CSV、JSON、Parquet、Avro,来者不拒
- Schema-on-Read:读的时候才定义结构,写的时候不校验
- 低成本存储:通常基于对象存储(S3、OSS、ADLS)
关键认知:数据湖不是某个产品,而是一种架构理念。Hadoop HDFS是早期的数据湖,但今天的云上对象存储才是主流。
我在项目中遇到过不少团队,把数据湖搞成了「数据沼泽」。为什么?因为只往里灌数据,没有治理、没有元数据、没有版本管理。最后谁也找不到想要的数据,这就是典型的「湖里全是泥」。
1.2 从数据湖到Lakehouse:架构演进之路
数据湖的问题很明显——不支持ACID事务、没有Schema强制、查询性能差。而数仓虽然性能好、事务强,但存不了非结构化数据,扩容还贵得要命。
那怎么办?业界开始琢磨:能不能把数仓的「事务能力」和「性能优化」搬到数据湖上?这就是Lakehouse的由来。
我画了一张演进图,你看一眼就明白了:
你看,Lakehouse不是凭空冒出来的。它把数据湖的「低成本、全类型」和数仓的「事务、性能」结合在了一起。底层还是对象存储,但上面加了一层「事务引擎」——Delta Lake、Apache Iceberg、Apache Hudi 是当前最主流的三个实现。
我的建议:如果你从零开始选型,优先考虑 Delta Lake 或 Iceberg。Hudi 在CDC场景有优势,但社区生态和Spark集成度上,Delta Lake 更成熟。
1.3 入湖场景:哪些数据需要入湖?
入湖不是什么都往里倒。我见过最夸张的案例,有人把MySQL的binlog全量入湖,一天几百TB,结果90%的数据从来没人查过。嗯,这里要注意——入湖之前先想清楚场景。
常见的入湖场景我归纳为四类:
| 场景类型 | 数据源 | 入湖频率 | 典型用途 |
|---|---|---|---|
| 业务库实时同步 | MySQL、PostgreSQL、Oracle | 秒级CDC | 实时报表、数据中台 |
| 日志与事件流 | Kafka、Flume、Syslog | 准实时(分钟级) | 监控、异常检测、用户行为分析 |
| 批量离线导入 | HDFS、FTP、S3 | 天级/小时级 | 历史数据归档、T+1报表 |
| 外部数据接入 | API、第三方SaaS | 按需/定时 | 补充数据维度、市场分析 |
我个人习惯把入湖策略分成「全量+增量」两阶段。第一次全量拉历史数据,之后只同步增量。全量用Spark批量读,增量用CDC工具(Debezium、Canal)实时推。
1.4 入湖挑战:你一定会遇到的坑
做数据入湖这么多年,踩过的坑能写一本书。我挑几个最典型的说说:
⚠️ 常见入湖陷阱
- 小文件爆炸:实时入湖每秒写一个文件,一天几百万个小文件,查询时NameNode直接挂掉
- Schema变更:上游加了个字段,下游入湖任务直接崩了
- 数据重复:Exactly-Once说起来简单,做起来全是泪
- 延迟敏感:业务说「我要实时」,其实5分钟延迟也能接受,别被忽悠
我曾经在一个金融项目中,因为没处理好Schema变更,导致凌晨2点入湖任务全挂,第二天早上报表出不来。从那以后,我强制要求所有入湖任务必须加Schema校验和自动兼容逻辑。
还有一个经典问题——入湖格式怎么选?
- Parquet:列存,压缩率高,查询快。我90%的场景都用它
- Avro:行存,写性能好,适合CDC和流式写入
- ORC:和Parquet类似,Hive生态用得多
- Delta Lake格式:在Parquet上加事务日志,推荐
我的经验法则:流式入湖用Avro + Delta Lake,批量入湖用Parquet + Delta Lake。别碰纯文本格式(CSV/JSON)做生产入湖,性能差到你想哭。
1.5 入湖架构的核心组件
一个完整的入湖管道,至少需要这几层:
- 数据源层:数据库、消息队列、文件系统、API
- 采集层:CDC工具(Debezium)、日志采集(Filebeat)、批量导入(Spark)
- 传输层:Kafka(高吞吐缓冲)、对象存储(最终落地)
- 转换层:Spark Structured Streaming、Flink
- 存储层:Delta Lake / Iceberg / Hudi 表格式
- 元数据层:Hive Metastore / AWS Glue / 自建Catalog
你想想看,这六层缺了哪一层都会出问题。我见过最惨的案例是跳过传输层,直接用Spark直连MySQL读数据入湖——结果把业务库读挂了。
避坑指南:入湖管道一定要加「背压机制」。Kafka的Topic分区数、消费者的并行度、写入对象存储的并发数,这三者必须匹配。我曾经因为分区数设少了,导致数据积压,延迟从秒级变成小时级。
1.6 本章小结
数据入湖不是简单的「把数据搬过去」。它涉及架构选型、格式选择、一致性保障、性能调优等多个维度。Lakehouse的出现,让我们既能享受数据湖的低成本,又能拥有数仓的事务和性能。
嗯,这一章先把概念和挑战讲清楚。后面的章节,我会带你一步步搭建一个生产级的入湖管道——从环境搭建到实时入湖,再到性能优化和监控告警。准备好了吗?