Paimon 与 Spark 的集成(二):查询优化
在大数据处理领域,Paimon 和 Spark 的集成为我们提供了强大的数据摄入、流式订阅和实时查询能力。本文将详细介绍Paimon在SparkSQL查询性能上的一系列关键优化点,这些优化使得Paimon x Spark在TpcDS上的性能提升了37+%,与Parquet x Spark基本持平。
动态分区裁剪
动态分区裁剪(Dynamic Partition Pruning,DPP)是SQL优化中的一个常见优化点,它通过谓词下推(Predicate Push Down)来最小化从数据源中读取数据的IO成本,从而减少计算成本。在数仓中,DPP特别有用,例如在事实表和维度表的关联查询中。Paimon通过SparkDataSourceV2的查询框架实现了动态分区裁剪的能力,显著减少了参与join的数据量,提升了查询性能。
Exchange 复用
Exchange是Spark中物理计划中的一个关键操作,对应逻辑计划中的Shuffle。在复杂的SQL中,通过公共表表达式(Common Table Expression,CTE)定义的SQL片段可以被多次使用。Spark提供了Exchange复用的优化,期待的执行计划可以减少不必要的冗余计算,降低IO和网络的开销。
动态调整 Scan 并发任务
在实际执行时,调整并发任务是影响作业运行性能的关键因素之一。Spark提供了参数来调整Join或Agg等算子的并发,但这些无法影响到读取数据源Scan阶段的并发。Paimon提供了基于当前作业的可用core数来动态调整数据源的数据分片的能力,从而提升查询效率。
合并标量子查询
合并标量子查询优化会遍历整个SQL逻辑执行计划,提取出标量子查询(Scalar SubQuery),尝试将多个标量子查询合并起来,使得仅执行一次子查询得到多个标量值。这种优化有效地减少了冗余的计算,提升了查询性能。
Cost-Based 优化
SparkSQL允许使用基于成本的优化(Cost-Based Optimizer,CBO)来提升查询性能,主要用于多路Join的场景。CBO依赖于计算Cost的模型,以及表的表级和列级统计信息的收集。Paimon在元数据中增加了statistics的信息,使得SparkSQL可以利用Paimon的表级/列级信息进行查询优化。
优化效果
通过上述优化,Paimon x Spark的性能得到了显著提升。在没有column级统计信息的情况下,优化后的Paimon和Parquet已经基本持平。开启column级统计信息后,Paimon较Parquet慢约8%,这将是性能优化继续跟进的方向之一。