第05章 数据湖技术¶
📚 章节概述¶
本章将深入讲解数据湖技术,包括Delta Lake、Apache Iceberg、Hudi等。通过本章学习,你将能够搭建生产级的数据湖。
🎯 学习目标¶
完成本章后,你将能够:
- 理解数据湖的核心概念
- 掌握Delta Lake的使用
- 了解Apache Iceberg和Hudi
- 掌握数据湖仓一体化
- 能够搭建生产级的数据湖
5.1 数据湖概述¶
5.1.1 什么是数据湖¶
数据湖是存储各种格式和类型的原始数据的存储系统。
数据湖特点¶
- 存储原始数据
- 不做预定义结构
- 保留原始格式
-
支持各种数据类型
-
低成本存储
- 对象存储
- 按需付费
-
高压缩比
-
弹性扩展
- 无限容量
- 高吞吐
- 低延迟
5.1.2 数据湖vs 数据仓库¶
| 特性 | 数据湖 | 数据仓库 |
|---|---|---|
| 数据 | 原始、非结构化 | 处理、结构化 |
| 模式 | Schema on Read | Schema on Write |
| 成本 | 低 | 高 |
| 灵活性 | 高 | 低 |
| 查询性能 | 较低 | 较高 |
5.2 Delta Lake¶
5.2.1 Delta Lake概述¶
Delta Lake是开源的存储层,为数据湖带来ACID事务。
核心特性¶
- ACID事务
- 原子性
- 一致性
- 隔离性
-
持久性
-
Schema Evolution
- 自动Schema管理
- 向后兼容
-
无缝升级
-
时间旅行
- 查询历史版本
- 数据回滚
- 审计追踪
5.2.2 Delta Lake使用¶
Python
from delta.tables import DeltaTable
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("DeltaLakeExample") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 写入Delta表
df = spark.read.json("data.json")
df.write.format("delta").save("/delta/sales")
# 读取Delta表
df = spark.read.format("delta").load("/delta/sales")
df.show()
# 更新Delta表
from delta.tables import DeltaTable
deltaTable = DeltaTable.forPath(spark, "/delta/sales")
deltaTable.update(
condition = "amount > 1000",
set = { "amount": "amount * 1.1" }
)
# 删除Delta表数据
deltaTable.delete("amount < 0")
# 时间旅行
df_old = spark.read.format("delta").option("versionAsOf", 0).load("/delta/sales")
5.3 Apache Iceberg¶
5.3.1 Iceberg概述¶
Apache Iceberg是开源的表格式,为大数据表带来SQL表的功能。
核心特性¶
- Schema Evolution
- 无锁Schema变更
- 向后兼容
-
自动迁移
-
分区进化
- 隐藏分区
- 动态分区
-
分区裁剪
-
时间旅行
- 快照管理
- 数据回滚
- 版本控制
5.3.2 Iceberg使用¶
Python
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("IcebergExample") \
.config("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.local.type", "hadoop") \
.config("spark.sql.catalog.local.warehouse", "s3://my-bucket/warehouse") \
.getOrCreate()
# 创建Iceberg表
spark.sql("""
CREATE TABLE local.db.sales (
id BIGINT,
product_id BIGINT,
customer_id BIGINT,
sale_date DATE,
quantity INT,
amount DECIMAL(10,2)
) USING iceberg
PARTITIONED BY (years(sale_date))
LOCATION 's3://my-bucket/sales'
""")
# 写入数据(DataFrameWriterV2 API)
df.writeTo("local.db.sales").append()
# 读取数据
df = spark.sql("SELECT * FROM local.db.sales")
df.show()
# 更新数据
spark.sql("""
UPDATE local.db.sales
SET amount = amount * 1.1
WHERE amount > 1000
""")
# 时间旅行
df_old = spark.sql("SELECT * FROM local.db.sales VERSION AS OF 0")
5.4 Apache Hudi¶
5.4.1 Hudi概述¶
Apache Hudi是开源的流式数据湖平台,支持增量处理和更新。
核心特性¶
- 增量处理
- Upsert支持
- Delete支持
-
CDC支持
-
表类型
- Copy On Write
-
Merge On Read
-
索引支持
- Bloom Filter
- HBase Index
- 简单索引
5.4.2 Hudi使用¶
Python
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("HudiExample") \
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
.config("spark.sql.hive.convertMetastoreParquet", "false") \
.getOrCreate()
# 写入Hudi表
hudi_options = {
'hoodie.table.name': 'sales',
'hoodie.datasource.write.recordkey.field': 'sale_id',
'hoodie.datasource.write.precombine.field': 'sale_date',
'hoodie.datasource.write.table.type': 'COPY_ON_WRITE',
'hoodie.upsert.shuffle.parallelism': 2,
'hoodie.insert.shuffle.parallelism': 2
}
df.write.format("org.apache.hudi") \
.options(**hudi_options) \
.mode("append") \
.save("s3://my-bucket/sales")
# 读取Hudi表
df = spark.read.format("org.apache.hudi") \
.load("s3://my-bucket/sales/*")
df.show()
# 增量写入
df.write.format("org.apache.hudi") \
.options(**hudi_options) \
.option("operation", "upsert") \
.mode("append") \
.save("s3://my-bucket/sales")
5.5 练习题¶
基础题¶
- 选择题
-
数据湖的核心特点不包括什么?
- A. 存储原始数据
- B. Schema on Read
- C. 高成本
- D. 弹性扩展
-
简答题
- 解释数据湖vs 数据仓库的区别。
- 说明Delta Lake的核心特性。
进阶题¶
- 实践题
- 搭建一个Delta Lake。
- 实现时间旅行功能。
-
实现Schema Evolution。
-
设计题
- 设计一个数据湖架构。
- 设计一个数据湖仓一体化方案。
答案¶
1. 选择题答案¶
- C(数据湖的核心特点不包括高成本)
2. 简答题答案¶
数据湖vs 数据仓库的区别: - 数据湖:原始数据、Schema on Read、低成本 - 数据仓库:处理数据、Schema on Write、高成本
Delta Lake的核心特性: - ACID事务 - Schema Evolution - 时间旅行
3. 实践题答案¶
参见5.2-5.4节的示例。
4. 设计题答案¶
参见5.1-5.4节的架构设计。
5.6 面试准备¶
大厂面试题¶
字节跳动¶
- 解释数据湖的核心概念。
- Delta Lake的优势是什么?
- 如何设计数据湖架构?
- 如何优化数据湖性能?
腾讯¶
- Iceberg和Hudi的区别是什么?
- 如何实现数据湖的时间旅行?
- 如何设计数据湖的分区策略?
- 如何设计数据湖的容灾?
阿里云¶
- 数据湖的最佳实践是什么?
- 如何设计数据湖仓一体化?
- 如何处理数据湖的数据质量?
- 如何设计数据湖的安全?
📚 参考资料¶
- Delta Lake文档:https://docs.delta.io/latest/
- Apache Iceberg文档:https://iceberg.apache.org/docs/
- Apache Hudi文档:https://hudi.apache.org/docs/
- 《Data Lakehouse》
🎯 本章小结¶
本章深入讲解了数据湖技术,包括:
- 数据湖的核心概念
- Delta Lake的使用
- Apache Iceberg和Hudi
- 数据湖仓一体化
通过本章学习,你掌握了数据湖的核心技术,能够搭建生产级的数据湖。下一章将深入学习实时数据处理。