Blaze:SparkSQL Native 算子优化在快手的设计与实践在当前时代,Spark因其相比Hive的强大性能,已成为众多公司主要的执行引擎。随着业务的不断扩展和数据规模的提升,对Spark性能提升的追求从未停止。Spark性能提升主要集中在两个方向:执行计划优化和运行时执行效率优化。分享将围绕Blaze项目展开,探索其在快手的设计与实践。Blaze是一个基于Apache DataFusion项目封装的向量化执行引擎中间件,旨在充分利用Spark分布式计算框架的优势,同时发挥DataFusion Native向量化算子执行的性能优势。首先,回顾Spark的发展历程,从1.0版本的解释执行模型到2.0版本的多算子编译,再到3.0版本引入的Adaptive Query Execution(AQE)自适应执行引擎,直至未来的优化方向——向量化执行。接着,探讨向量化执行的进展,包括Velox、Gluten、Photon和Native Codegen等公司的探索与实践,以及它们如何结合Spark生态进行性能提升。Blaze项目在快手的探索始于两年前,经过持续迭代,目前已具备上线使用的能力。 Blaze基于Apache DataFusion项目封装,通过扩展组件将Spark生成的物理执行计划转换为对应的Native执行计划,进而传递给底层的DataFusion执行引擎。整体架构包括Spark on Blaze架构的流向,展示如何通过Blaze Extension组件将Spark执行流程与DataFusion Native执行引擎连接起来,以及执行计划转换、Native计划生成与提交的过程。核心组件包括Blaze Session Extension、Plan SerDe、JNI Gateways和Native Operators。执行过程分为物理执行计划的转换、Native计划生成与提交,以及Native执行三个阶段。物理执行计划转换部分涉及算子检查、翻译与优化策略,以确保转换对性能的影响降到最低。Native计划生成与提交涉及序列化与JNI传递,而Native执行则通过DataFusion框架异步执行。Blaze项目在实际应用中实现了对TPC-DS数据集的高效处理,支持大量业务UDF调用,并提供了内存管理、UDF兼容等优化。此外,项目还实现了对特定算子的深度定制优化,如排序、聚合等。当前进展包括算子覆盖度的提升、基准测试结果、线上收益及未来工作规划。算子覆盖度基本按照线上使用频率推进,支持常见的算子,对某些算子进行优化和改进。性能测试显示在特定场景下能够实现高达10倍的性能提升。线上应用已实现部分生产ETL任务的性能提升,单任务性能提升最多可达四倍以上。未来工作计划包括持续优化算子支持、大规模推广、接口抽象以支持更多引擎以及回馈开源社区。项目已开放初步可用版本,欢迎更多开发者参与共建。本文总结了Blaze项目在快手的设计与实践,展示了其在Spark性能提升方面的探索与应用,为业界提供了宝贵的参考与借鉴。