Apache Gluten源码解析:从Substrait协议到执行计划生成的底层逻辑

发布时间:2026/7/27 21:16:16
Apache Gluten源码解析:从Substrait协议到执行计划生成的底层逻辑
Apache Gluten源码解析从Substrait协议到执行计划生成的底层逻辑【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/glutenApache Gluten作为连接JVM SQL引擎与原生执行引擎的中间层其核心能力在于将SQL查询高效转换为原生执行计划。本文将深入解析Gluten如何基于Substrait协议实现执行计划的生成与优化揭示从查询解析到原生执行的完整链路。Substrait协议跨引擎的执行计划通用语言Substrait协议作为Gluten的神经中枢定义了SQL执行计划的标准化表示格式。在Gluten架构中Substrait承担着统一执行计划表示与跨引擎协作的双重角色使得Spark等JVM引擎能够无缝对接Velox、ClickHouse等原生执行器。Gluten通过SubstraitTransformerSupport接口实现执行计划的转换逻辑核心代码位于gluten-substrait/src/main/scala/io/glutenproject/substrait/transformer/SubstraitTransformerSupport.scala。该接口定义了validate()和doTransform()两个关键方法分别负责验证转换可行性和执行实际转换。执行计划转换的核心流程Gluten的执行计划转换过程可分为三个关键阶段Substrait计划生成、计划验证和Velox执行计划构建。这一流程通过多个组件协同完成形成完整的转换链路。1. Spark计划到Substrait的转换Spark执行计划首先通过一系列Transformer转换为Substrait格式。以HashJoin为例HashJoinTransformer实现了特定算子的转换逻辑通过重写doTransform()方法生成Substrait JoinRel节点。图Gluten中Spark执行计划到Substrait的转换架构展示了不同类型执行节点的转换路径2. Substrait计划验证生成的Substrait计划需要经过严格验证才能进入下一阶段。SubstraitToVeloxPlanValidator类位于cpp/velox/substrait/SubstraitToVeloxPlanValidator.h负责这一工作它会检查计划的合法性和Velox引擎的兼容性。验证逻辑涵盖数据类型兼容性检查函数支持性验证执行逻辑合法性校验3. Velox执行计划构建验证通过后SubstraitToVeloxPlanConverter类cpp/velox/substrait/SubstraitToVeloxPlan.h将Substrait计划转换为Velox可执行的计划节点。该转换器支持多种关系代数操作的转换包括// 部分核心转换方法示例 core::PlanNodePtr toVeloxPlan(const ::substrait::JoinRel sJoin); core::PlanNodePtr toVeloxPlan(const ::substrait::AggregateRel aggRel); core::PlanNodePtr toVeloxPlan(const ::substrait::ProjectRel projectRel); core::PlanNodePtr toVeloxPlan(const ::substrait::FilterRel filterRel);表达式转换从Substrait到Velox的语义映射表达式转换是执行计划生成的关键环节SubstraitToVeloxExpr类cpp/velox/substrait/SubstraitToVeloxExpr.h负责将Substrait表达式转换为Velox表达式树。这一过程包括函数映射通过函数签名匹配将Substrait函数映射到Velox原生函数类型转换处理不同引擎间的数据类型差异表达式构建递归构建Velox表达式树Gluten维护了详细的函数映射关系确保SQL语义在转换过程中准确保留。对于复杂表达式转换器会自动生成等价的Velox执行逻辑。执行流程可视化从数据读取到结果返回Gluten的完整执行流程涵盖了从数据读取到结果返回的各个环节。以下流程图展示了典型查询的执行路径图Gluten执行流程示意展示了数据从Parquet读取到最终聚合结果的处理路径核心执行步骤包括数据读取通过Columnar Reader读取列式数据投影操作选择需要的列减少数据传输量聚合计算在原生引擎中执行高效聚合列式 shuffle采用列式格式进行数据交换结果转换将原生执行结果转换为JVM可处理格式核心源码解析关键类与接口Gluten的Substrait转换功能主要通过以下核心组件实现SubstraitToVeloxPlanConverter该类是计划转换的核心提供了将Substrait Rel节点转换为Velox PlanNode的完整实现。其核心方法toVeloxPlan通过访问者模式处理不同类型的Substrait关系节点并构建相应的Velox执行计划树。VeloxPlanConverter位于cpp/velox/compute/VeloxPlanConverter.h的VeloxPlanConverter类整合了Substrait转换与Velox执行的各个环节协调计划转换、函数映射和资源管理等功能。SubstraitTransformerExec作为Spark执行计划与Substrait之间的桥梁SubstraitTransformerExec重写了Spark的执行逻辑将传统的行式执行路径转换为基于Substrait的列式执行路径。性能优化Substrait转换的效率考量Gluten在Substrait转换过程中融入了多项性能优化延迟转换仅在必要时才进行完整的计划转换缓存机制缓存常用计划转换结果避免重复计算增量更新支持执行计划的增量修改减少整体转换开销类型推导在转换阶段进行精确的类型推导减少运行时类型检查这些优化确保了Substrait转换过程本身不会成为性能瓶颈反而通过更高效的原生执行提升整体查询性能。总结Gluten如何重塑SQL执行流程Apache Gluten通过Substrait协议实现了JVM SQL引擎与原生执行器的无缝对接其核心价值体现在跨引擎兼容Substrait协议打破了执行计划的语言壁垒性能提升将执行逻辑下推到原生引擎充分利用硬件能力架构解耦使SQL引擎与执行器可以独立演进生态整合为不同计算引擎提供统一的交互标准通过深入理解Gluten的Substrait转换机制开发者可以更好地利用这一框架优化SQL查询性能或为新的执行引擎开发适配层。Gluten的设计理念为大数据处理领域提供了一种新的性能优化思路展示了中间层技术在异构计算环境中的重要作用。要深入探索Gluten源码建议从gluten-substrait和cpp/velox/substrait目录开始这两个模块包含了Substrait协议处理的核心实现。同时docs/developers/SubstraitModifications.md文档提供了Gluten对Substrait协议扩展的详细说明。【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/gluten创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考