华为云实时数据湖查询优化主要介绍了华为云数据湖的架构、Hudi查询能力以及针对Hudi的性能优化措施。
华为云数据湖介绍
- 数据湖基础架构:采用hudi作为数据湖基座,支持hdfs/对象存储obs。
- 数据入湖:历史存量数据通过CDM一次性搬迁,新增数据通过CDL实时搬迁。
- 数据存储:选用hudi作为数据湖的基座,支持hdfs/对象存储obs。
- 数据加工:流式加工使用FlinkSQL增量拉取hudi表数据,批量加工使用Spark、SparkSQL两种方式。
- 交互式分析:hetu引擎承担数据湖的查询出口。
Hudi查询能力介绍
- Hudi介绍:支持流式挖掘、增量查询、高效的更新和删除能力、可插拔索引、事务、MVCC、并发控制、schema evolution、time travel等。
- 丰富的表级别服务:自动小文件合并、数据布局优化(clustering、compaction、clean)。
- 丰富的生态集成:支持flink/spark写入,Presto/hive/spark/flink等查询。
Clustering
- hudi提供三种聚类方式:空间曲线z-order/hilbert生成、普通sort、MDT。
- 数据布局优化配合FileSkipping才能更好地发挥效果。
- 空间曲线z-order/hilbert生成:类似于对每列做加权平均排序,对队列排序效果更好。
- MDT:metatable是hudi的元数据信息表,支持收集列的统计信息(min-max value、null count、total count),并保证原子性,用于fileSkipping。
高性能fileList
- hudi通过metatable将文件信息直接保存在下来,避免了大规模fileList操作。
华为云基于hudi的性能优化
- Hudi索引优化:
- 数据索引:Min-max索引、Lucene索引、Bitmap索引。
- Min-max索引:基于MDT,需要clustering排序,利用hfile高效点查能力。
- Lucene索引:利用倒排索引能力,赋予hudi高效的多维查询和文本检索能力。
- Bitmap索引:采用bit数组存储和计算,查询时直接用索引位图做运算。
- 二级索引构建:
- 引入新的timeline类型:index。
- 借助index服务,负责索引计划的执行。
- 各种索引对比和使用建议:
- Min-max索引:适合点查场景。
- Lucene索引:适合多维查询和文本检索。
- Bitmap索引:适合等值过滤条件。
- 统计信息优化:
- 利用hudi的MDT能力,实时收集统计信息并存入MDT。
- 支持同步/异步方式构建统计信息。
- 查询瓶颈分析+索引缓存:
- MDT文件大小增长导致访问性能下降。
- list files和list index info操作耗时较长。
- MDT查询冷启动导致每次查询都有不必要的开销。
- Parquet元数据信息读取耗时。
- 优化措施:缓存mdt索引数据,利用callback机制刷新缓存。
后续工作
- 热点数据缓存。
- 实时物化视图。
- Mor表读性能优化:引入delete vectors,平衡hudi读写开销。
实际效果
- 采用和ck一样的SSB数据集进行测试,数据规模1.5T,120亿条数据,性能提升3x到11x。