湖仓存储系统设计剖析和性能优化
湖仓系统概述
阿里云EMR湖仓系统具备统一Catalog、存算分离、支持多样workload(批流一体、事务ACID、Schema Evolution)、数据管理/审计、开放/开源等特性。
核心设计
元数据管理
- Merge-On-Read (MOR): 避免写放大,合并增量数据,通过Compaction实现数据合并。
- 元数据加载流程:
- DeltaLake: 定位最新ckp元数据文件,解析deltalog json文件,获取schema、配置和有效数据文件列表。
- Iceberg: 定位metadata文件,解析manifestlist和manifest文件,获取schema、配置和有效数据文件列表。
- Hudi: 解析hoodie.properties获取schema和配置,通过ListFileSystem+Timeline或metadata表获取有效数据文件列表。
Merge-On-Read实现
- Hudi: 1个FileGroup包含1个basefile和N个logfile,logfile保存更新或删除记录的主键,查询时合并base和logfile数据。
- DeltaLake: 使用Deletion Vectors (DV)记录要标记数据的文件offset信息,通过RoaringBitmap管理,一个AddFile最多伴随一个DV。
性能优化
查询优化
元数据加载
- 加载方式:
- 单点加载: 适用于小表,内存压力大的场景(如Iceberg、Delta-Standalone)。
- 分布式加载: 适用于大表,需启动SparkJob(如Delta、Hudi)。
- EMRManifest: 核心ODS表,支持定期/增量构建,内存仅10%,元数据秒级加载。
- EMRDatalakeMetastore: 中心化元数据服务,兼容社区版本,支持双写,更精准的文件裁剪。
优化器与统计信息
- Statistics: 包括TableStatistics和ColumnStat,用于Cost-Based Optimization (CBO)。
- 收集方式: ANALYZE TABLE FOR ALL COLUMNS或湖格式DML PostHook。
- 优化示例: SELECT COUNT(*) FROM TABLE优化为LocalRelation(countValue)。
其他查询优化
- 小文件合并: Delta的Optimize、Hudi的Clustering、Iceberg的Compaction,目标文件大小和执行方式。
- 文件裁剪: DatabricksDeltaLake的BloomFilter、Hudi的Multi-ModalIndex、EMRDataLakeMetastore的IndexSystem。
- ParquetReader: 压缩(snappy、gzip等)、filter pushdown、向量化Reader、自定义NativeParquet Reader。
写入优化
- 表类型选择: COW或MOR。
- TableService与Checkpoint: 定期/增量构建,支持Optimize/Clustering/Compaction、Vacuum/Clean/Expire。
- 参数调优: 写入操作类型(bulk_insert/upsert)、Parquet/ORC配置等。
- 流式写入: PostProcess方式影响效率,流式写入+离线湖表管理(Flink+Spark、HudiServiceManager、DLF自动化湖表管理)。
研究结论
- MOR设计有效避免写放大,提升读写性能。
- 元数据加载优化(如EMRManifest)显著提升加载效率。
- 统计信息收集与优化器结合,实现精准查询优化。
- 小文件合并和文件裁剪减少查询开销。
- 写入优化需结合表类型选择和参数调优,提升写入效率。