华为云基于 Apache Hudi 极致查询优化的探索
实践!
FI_mengtao 发表于 2022/09/23 11:40:39 2022/09/23
982 0 0
【摘要】 湖仓一体(LakeHouse)是一种新的开放式架构,它结合了数据湖和数据仓库的最佳元
素,是当下大数据领域的重要发展方向。 华为湖仓一体架构核心基座是 Apache Hudi,所有入湖
数据都通过 Apache Hudi 承载,对外通过 HetuEngine(Presto增强版)引擎承担一站式SQL分析
角色,因此如何更好的结合 Presto 和 Hudi 使其查询效率接近专业的分布式数仓意义重大。
背景
湖仓一体(LakeHouse)是一种新的开放式架构,它结合了数据湖和数据仓库的最佳元素,是当下
大数据领域的重要发展方向。
华为云早在2020年就开始着手相关技术的预研,并落地在华为云 智能数据湖解FusionInsight MRS
决方案中。
目前主流的三大数据湖组件 Apache Hudi、Iceberg、Delta各有优点,业界也在不断探索选择适
合自己的方案。
华为湖仓一体架构核心基座是 Apache Hudi,所有入湖数据都通过 Apache Hudi 承载,对外通
过 HetuEngine(Presto增强版)引擎承担一站式SQL分析角色,因此如何更好的结合 Presto 和
Hudi 使其查询效率接近专业的分布式数仓意义重大。查询性能优化是个很大的课题,包括索引、
数据布局、预聚合、统计信息、引擎 Runtime优化等等。本文主要介绍 Presto 如何更好的利用
Hudi 的数据布局、索引信息来加速点查性能。预聚合和统计信息我们将在后续分享。
数据布局优化
大数据分析的点查场景一般都会带有过滤条件,对于这种类型查询,如果目标结果集很小,理论
上我们可以通过一定手段在读取表数据时大量跳过不相干数据,只读取很小的数据集,进而显著
的提升查询效率。我们可以把上述技术称之为 。DataSkipping
好的数据布局可以使相关数据更加紧凑(当然小文件问题也一并处理掉了)是实现DataSkipping
的关键一步。日常工作中合理设置分区字段、数据排序都属于数据布局优化。当前主流的查询引
擎 Presto/Spark 都可以对Parquet文件做 Rowgroup 级别过滤,最新版本甚至支持 Page 级别的
过滤;选取合适的数据布局方式可以使引擎在读取上述文件可以利用列的统计信息轻易过滤掉大
量 Rowgroup/Page,进而减少IO。
那么是不是 仅仅依赖数据布局就好了?其实不然。上述过滤还是要打开表里每一个DataSkipping
文件才能完成过滤,因此过滤效果有限,数据布局优化配合 才能更好的发挥效果。FileSkipping
当我们完成数据布局后,对每个文件的相关列收集统计信息,下图给个简单的示例,数据经过排
序后写入表中生成三个文件,指定点查 下图可以清楚的看出 的结果集只存在where a < 10 a < 10
于 文件中, 中 a 的最小值都比10大,显然不可能存在结果集,所以parquet1 parquet2/parquet3
直接裁剪掉 和 即可。parquet2 parquet3