DeltaLake原理及其在EBAY的实践总结
Delta Lake原理
Delta Lake是一个开源存储框架,用于构建Lakehouse架构,支持Spark、PrestoDB、Flink、Trino、Hive等多种计算引擎,并提供Scala、Java、Rust、Ruby、Python等API。其核心原理包括:
- 使用事务日志(compact into Apache Parquet format)提供ACID特性、时间旅行和更快的元数据操作
- 通过元数据层添加事务、版本控制和辅助数据结构,支持多种API和引擎查询
- 提供高级功能如自动数据布局优化、缓存和审计日志
项目背景与需求
EBay为平滑迁移原有数仓,选择开源方案Delta Lake,需求包括:
- 兼容原有数仓功能,SQL语法保持一致,用户无感知
- 查询性能尽量保持一致
- 核心财务数据表全部迁移
- 处理大量更新和删除请求
项目挑战与解决方案
主要挑战及解决方案:
- Delta Lake 0.4不支持SQL → 自研SQL解析器
- Spark 2.3不支持Delta Lake → 升级至Spark 3.x
- Spark 3.x不支持行级别跨表更新删除 → 自研功能增强
- Delta Lake性能不足 → 优化Join操作和元数据操作
- Delta表缺乏自动化优化和管理 → 开发自研AutoVacuum和TableCompact服务
项目时间线
- 2019.11:需求调研
- 2020.02:功能上线
- 2020.05:全量上线
- 2020.12:Spark升级至3.0
- 2021.11:Delta升级至0.8
功能增强
- 支持跨表更新删除
- 增加约束功能(NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT)
- 支持子查询(WHERE、UPDATE/DELETE)
- 支持CONVERT TO DELTA/Delta表ALTER TABLE/RENAME等操作
- 提供行级更新删除指标和插入指标
性能优化
- 优化Join操作(filter pushdown、投影优化)
- 优化元数据操作(跳过无用列读取、避免Spark驱动OOM)
- 优化更新删除操作(简化逻辑、约束替换优化)
易用性管理
- Delta表AutoVacuum服务:
- 定期清理非当前snapshot文件
- 元数据异步写入第三方存储,保留二次检测机制
- 在SparkUI展示表信息和vacuum情况
- Transparent Table Compact服务:
- 自动合并小文件,优先级最低避免冲突
- 通过flag文件检测命令冲突
- 其他易用性增强:
- 支持ANALYZE COMPUTE STATISTICS
- 优化分区表操作
- 返回更新删除结果和物理计划解释
- 支持时间旅行SQL