大数据面试问答-数据湖
1. 概念
数据湖(Data Lake):
以原始格式(如Parquet、JSON等)存储海量原始数据的存储库,支持结构化、半结构化和非结构化数据(如文本、图像)。采用Schema-on-Read模式,数据在读取时才定义结构,适合机器学习、探索性分析等场景。
2. 与数仓对比
维度 | 数据仓库 | 数据湖 |
---|---|---|
数据存储 | 处理后的结构化数据 | 原始数据(结构化/半结构化/非结构化) |
Schema处理 | Schema-on-Write(写入时定义结构) | Schema-on-Read(读取时定义结构) |
处理流程 | ETL(提取-转换-加载) | ELT(提取-加载-转换) |
用户群体 | 业务分析师、BI工程师 | 数据科学家、数据工程师 |
查询性能 | 高性能,优化用于复杂查询 | 依赖计算引擎(如Spark),灵活性高 |
扩展性 | 垂直扩展为主,成本较高 | 水平扩展,成本较低(基于对象存储) |
数据治理 | 严格的数据质量与元数据管理 | 需额外治理(易成“数据沼泽”) |
典型技术栈 | Snowflake、Redshift、BigQuery(现代云数据仓库) | AWS S3、Azure Data Lake + Spark/Hive |
数据仓库的治理是“被动”的(写入时已结构化),而数据湖的治理是“主动”的(需额外定义元数据和质量规则)。两者的治理目标一致,但数据湖的治理复杂度更高。
2.1 优缺点分析
数据仓库
优点:数据一致性强、查询高效、易于业务用户使用。
缺点:扩展成本高、灵活性差,难以处理非结构化数据。
数据湖
优点:存储成本低、支持多样数据类型、适合探索性分析。
缺点:缺乏内置治理,需额外工具管理元数据和质量(如Apache Atlas、AWS Glue)。
2.2 应用场景
数据仓库:
定期生成标准化报表(如销售月报)。
需要高性能聚合查询的OLAP场景。
数据湖:
机器学习模型训练(需原始数据)。
日志分析、IoT设备数据存储等非结构化处理。
3. Delta Lake与Apache Hudi
两者均属于Lakehouse技术,旨在为数据湖添加数据仓库的管理能力,解决传统数据湖的痛点:
ACID事务:支持并发写入和读一致性。
数据版本控制:时间旅行(Time Travel)功能。
更新/删除:支持CDC(Change Data Capture)场景。
优化查询性能:通过索引、压缩等技术加速分析。
3.1 Delta Lake
背景:由Databricks开源,深度集成Spark生态。
核心功能:
事务日志:通过JSON事务日志(Delta Log)记录所有操作,实现ACID。
Schema演进:支持自动合并Schema变更(如新增列)。
优化工具:OPTIMIZE
命令压缩小文件,Z-Order
优化数据布局。
用例:
流批一体处理(同一张表同时支持流式写入和批量分析)。
机器学习特征存储(支持版本回滚)。
# 将数据保存为Delta格式
df.write.format("delta").save("/data/events")
# 时间旅行查询
spark.read.format("delta").option("versionAsOf", 10).load("/data/events")
3.2 Apache Hudi
背景:由Uber开源,强调高效的增量更新和删除。
核心功能:
索引机制:支持布隆过滤器、HBase索引等,快速定位数据文件。
表类型:
Copy-on-Write:更新时重写文件(适合读多写少)。
Merge-on-Read:更新时追加日志文件(适合写密集场景)。
用例:
数据库CDC同步(如MySQL Binlog入湖后更新Hudi表)。
实时数据湖(支持低延迟写入)。
// 写入Hudi表
hoodieWriteConfig = HoodieWriteConfig.newBuilder().withPath("/data/events").build();
JavaRDD<HoodieRecord> records = ...;
client.upsert(records, commitTime);